Current section
Files
Jump to
Current section
Files
src/oas/generator/ast.gleam
import glance
import gleam/list
import gleam/option.{None}
import gleam/string
import justin
pub fn access(object_or_mod, field) {
glance.FieldAccess(glance.Variable(object_or_mod), field)
}
pub fn call(f, arg) {
case f {
glance.FnCapture(None, f, before, after) -> {
let args = list.flatten([before, [glance.UnlabelledField(arg)], after])
glance.Call(f, args)
}
_ -> glance.Call(f, [glance.UnlabelledField(arg)])
}
}
pub fn call0(m, f) {
glance.Call(access(m, f), [])
}
pub fn call1(m, f, a) {
glance.Call(access(m, f), [glance.UnlabelledField(a)])
}
pub fn call2(m, f, a, b) {
glance.Call(access(m, f), [
glance.UnlabelledField(a),
glance.UnlabelledField(b),
])
}
pub fn pipe(a, b) {
glance.BinaryOperator(glance.Pipe, a, b)
}
// ------------------------------
fn replace_gleam_keywords(key) {
case key {
"type" -> "type_"
"auto" -> "auto_"
"import" -> "import_"
// used in places
"base" -> "base_"
"path" -> "path_"
"method" -> "method_"
"token" -> "token_"
_ -> key
}
// case key {
// "_" <> key -> key
// _ -> key
// }
// // github is weird
}
fn replace_disallowed_charachters(in) {
in
|> string.replace("/", "_")
|> string.replace("+", "_")
// this is part of kebab casing
// |> string.replace("-", "Minus")
}
fn prefix_numbers(in) {
let needs_prefix =
list.any(
["1", "2", "3", "4", "5", "6", "7", "8", "9", "0"],
string.starts_with(in, _),
)
case needs_prefix {
True -> "n" <> in
False -> in
}
}
fn prefix_signs(in) {
let in = case string.starts_with(in, "-") {
True -> "negative" <> in
False -> in
}
case string.starts_with(in, "+") {
True -> "positive" <> in
False -> in
}
}
pub fn name_for_gleam_type(in) {
in
|> prefix_signs
|> replace_disallowed_charachters
|> justin.pascal_case()
|> prefix_numbers
}
pub fn name_for_gleam_field_or_var(in) {
in
|> prefix_signs
// calling snake case might remove a leading `_` and expose numbers
|> justin.snake_case()
|> prefix_numbers
|> replace_disallowed_charachters
|> replace_gleam_keywords()
}