Packages
oaspec
0.48.0
0.68.0
0.67.0
0.66.0
0.65.0
0.64.0
0.63.0
0.62.0
0.61.0
0.60.0
0.59.0
0.58.1
0.58.0
0.57.0
0.56.0
0.55.0
0.54.0
0.53.0
0.52.0
0.51.0
0.50.0
0.49.0
0.48.0
0.47.0
0.46.0
0.45.0
0.44.0
0.43.0
0.42.0
0.41.0
0.40.0
0.39.0
0.38.0
0.37.0
0.36.0
0.35.0
0.34.0
0.33.0
0.32.0
0.31.0
0.30.0
0.29.0
0.28.0
0.27.0
0.26.0
0.25.0
0.24.0
0.23.0
0.22.0
0.21.0
0.20.0
0.19.0
0.18.0
0.17.0
0.16.0
0.15.0
0.14.0
0.13.0
0.12.0
0.11.0
0.10.0
0.9.0
0.8.0
0.7.0
0.6.3
0.6.1
0.6.0
0.5.0
0.4.0
0.3.0
0.1.3
Generate Gleam code from OpenAPI 3.x specifications
Current section
Files
Jump to
Current section
Files
src/oaspec.gleam
import argv
import gleam/bool
import gleam/io
import gleam/list
import gleam/string
import glint
import oaspec/internal/cli
import oaspec/internal/codegen/context
@external(erlang, "erlang", "halt")
fn halt(code: Int) -> Nil
/// CLI entry point for the oaspec code generator.
///
/// Routes diagnostic output to stderr while keeping requested output (such as
/// `--help` text) on stdout, following POSIX/CLIG conventions.
pub fn main() -> Nil {
let arguments = argv.load().arguments
case arguments {
["--version", ..] -> io.println("oaspec v" <> context.version)
_ -> run_glint(normalize_argv(arguments))
}
}
fn run_glint(arguments: List(String)) -> Nil {
case glint.execute(cli.app(), arguments) {
Error(message) -> {
io.println_error(message)
halt(1)
}
Ok(glint.Help(text)) -> io.println(text)
Ok(glint.Out(_)) -> Nil
}
}
/// Translate `--name value` into `--name=value` for the value-bearing long
/// options listed in `cli.value_flag_names`. glint 1.x only accepts the
/// `=`-joined form, so users who reach for the GNU `--name value` convention
/// (or who copy commands from `git`/`gh`/`cargo` muscle memory) hit
/// `invalid flag '<name>'`. The normalisation happens before glint sees the
/// argv so existing `--name=value` callers are unaffected, and so unknown
/// flags still surface from glint with their original error.
///
/// Other shapes are passed through untouched:
/// - `--name=value`: already canonical (the name has `=` in it, so no match)
/// - `--bool-flag`: not in the value-bearing list
/// - `--name -other`: a `-`-prefixed value is treated as the next flag, so
/// the original (broken) call is preserved and glint reports it as before
pub fn normalize_argv(arguments: List(String)) -> List(String) {
do_normalize(arguments, [])
}
fn do_normalize(arguments: List(String), acc: List(String)) -> List(String) {
case arguments {
[] -> list.reverse(acc)
[arg, value, ..rest] -> {
use <- bool.lazy_guard(
!{ is_value_long_flag(arg) && value_is_value(value) },
fn() { do_normalize([value, ..rest], [arg, ..acc]) },
)
do_normalize(rest, [arg <> "=" <> value, ..acc])
}
[single, ..rest] -> do_normalize(rest, [single, ..acc])
}
}
fn is_value_long_flag(arg: String) -> Bool {
use <- bool.guard(!string.starts_with(arg, "--"), False)
let name = string.drop_start(arg, 2)
list.contains(cli.value_flag_names, name)
}
fn value_is_value(arg: String) -> Bool {
!string.starts_with(arg, "-")
}