Skip to main content

luaur_bytecode_cli/functions/
parse_args.rs

1//! Node: `cxx:Function:Luau.Bytecode.CLI:CLI/src/Bytecode.cpp:47:parse_args`
2//! Source: `CLI/src/Bytecode.cpp:47-97`
3
4use alloc::string::String;
5use core::ffi::c_char;
6use std::ffi::CStr;
7
8use luaur_cli_lib::functions::set_luau_flags_flags_alt_b::set_luau_flags_c_char;
9
10use crate::functions::display_help::display_help;
11use crate::records::global_options::globalOptions;
12
13pub(crate) fn parse_args(argc: i32, argv: *mut *mut i8, summary_file: &mut String) -> bool {
14    for i in 1..argc {
15        let arg_ptr = unsafe { *argv.add(i as usize) };
16        let arg = unsafe { CStr::from_ptr(arg_ptr) };
17        let arg_str = arg.to_str().unwrap();
18
19        if arg_str == "-h" || arg_str == "--help" {
20            let argv0 = unsafe { CStr::from_ptr(*argv) };
21            display_help(argv0.to_str().unwrap());
22        } else if arg_str.starts_with("-O") {
23            let level_str = &arg_str[2..];
24            let level: i32 = level_str.parse().unwrap_or(0);
25            if level < 0 || level > 2 {
26                eprintln!("Error: Optimization level must be between 0 and 2 inclusive.");
27                return false;
28            }
29            // globalOptions.optimizationLevel = level;
30            unsafe {
31                globalOptions.optimization_level = level;
32            }
33        } else if arg_str.starts_with("-g") {
34            let level_str = &arg_str[2..];
35            let level: i32 = level_str.parse().unwrap_or(0);
36            if level < 0 || level > 2 {
37                eprintln!("Error: Debug level must be between 0 and 2 inclusive.");
38                return false;
39            }
40            // globalOptions.debugLevel = level;
41            unsafe {
42                globalOptions.debug_level = level;
43            }
44        } else if arg_str.starts_with("--summary-file=") {
45            let filename = &arg_str[15..];
46            if filename.is_empty() {
47                eprintln!("Error: filename missing for '--summary-file'.\n");
48                return false;
49            }
50            *summary_file = filename.to_string();
51        } else if arg_str.starts_with("--fflags=") {
52            // setLuauFlags(argv[i] + 9);
53            unsafe {
54                set_luau_flags_c_char(arg_ptr.add(9) as *const c_char);
55            }
56        } else if arg_str.starts_with('-') {
57            eprintln!("Error: Unrecognized option '{}'.\n", arg_str);
58            let argv0 = unsafe { CStr::from_ptr(*argv) };
59            display_help(argv0.to_str().unwrap());
60        }
61    }
62
63    true
64}