///|
pub fn parse_cli(args : Array[String]) -> CliParseResult {
if args.length() == 0 {
return valid_cli(Help, Markdown, "", "", "")
}
let command = match args[0] {
"help" | "--help" | "-h" => Help
"version" | "--version" => Version
"demo" => Demo
"validate" => Validate
"render" => Render
"benchmark" => Benchmark
_ => return invalid_cli("unknown command: " + args[0])
}
let mut format = Markdown
let mut input = ""
let mut input_path = ""
let mut output = ""
let mut index = 1
while index < args.length() {
let flag = args[index]
if flag == "--format" {
if index + 1 >= args.length() {
return invalid_cli("--format needs a value")
}
match cli_format(args[index + 1]) {
Some(value) => format = value
None => return invalid_cli("unknown format: " + args[index + 1])
}
index += 2
} else if flag == "--text" {
if index + 1 >= args.length() {
return invalid_cli(flag + " needs a value")
}
input = args[index + 1]
index += 2
} else if flag == "--input" {
if index + 1 >= args.length() {
return invalid_cli(flag + " needs a value")
}
input_path = args[index + 1]
index += 2
} else if flag == "--output" {
if index + 1 >= args.length() {
return invalid_cli("--output needs a value")
}
output = args[index + 1]
index += 2
} else {
return invalid_cli("unknown option: " + flag)
}
}
if input != "" && input_path != "" {
invalid_cli("--text and --input are mutually exclusive")
} else {
valid_cli(command, format, input, input_path, output)
}
}
///|
pub fn cli_user_args(args : Array[String]) -> Array[String] {
let start = if args.length() > 0 && looks_like_program(args[0]) {
1
} else {
0
}
let result : Array[String] = []
for i in start.. Bool {
text.contains(".wasm") ||
text.contains(".exe") ||
text.contains(".js") ||
text.contains("_build")
}
///|
fn cli_format(name : String) -> CliFormat? {
match normalize_identifier(name) {
"markdown" | "md" => Some(Markdown)
"html" => Some(Html)
"css" => Some(Css)
"json" => Some(Json)
"yaml" | "yml" => Some(Yaml)
"tailwind" => Some(Tailwind)
"figma" | "figma-tokens" => Some(Figma)
_ => None
}
}
///|
fn valid_cli(
command : CliCommand,
format : CliFormat,
input : String,
input_path : String,
output : String,
) -> CliParseResult {
let request = CliRequest::new(command, format, input, output)
{ request: Some({ ..request, input_path, }), errors: [] }
}
///|
fn invalid_cli(message : String) -> CliParseResult {
{ request: None, errors: [message] }
}