added custom flag formats
This commit is contained in:
parent
d95eff2944
commit
ce9cd30cae
@ -8,6 +8,8 @@ import "core:strconv"
|
|||||||
import "core:strings"
|
import "core:strings"
|
||||||
|
|
||||||
FORCE_HELP_ON_EMPTY_ARGS := false
|
FORCE_HELP_ON_EMPTY_ARGS := false
|
||||||
|
FLAG_START_CHAR := "-"
|
||||||
|
FLAG_SEP_CHAR := "="
|
||||||
|
|
||||||
Flag_Value_Ptr :: union {
|
Flag_Value_Ptr :: union {
|
||||||
^bool,
|
^bool,
|
||||||
@ -48,18 +50,20 @@ print_flags :: proc() {
|
|||||||
|
|
||||||
print_usage :: proc() {
|
print_usage :: proc() {
|
||||||
fmt.println("\tUsage: ")
|
fmt.println("\tUsage: ")
|
||||||
|
fmt.println("\n\tFlag format for this program:")
|
||||||
|
fmt.printfln("\t%s<flag>%s<value>\n", FLAG_START_CHAR, FLAG_SEP_CHAR)
|
||||||
for f in all_flags {
|
for f in all_flags {
|
||||||
switch v in f.value {
|
switch v in f.value {
|
||||||
case ^bool:
|
case ^bool:
|
||||||
fmt.printfln("\t-%s:\n\t\t%s (default: %v)\n", f.name, f.usage, v^)
|
fmt.printfln("\t%s%s:\n\t\t%s (default: %v)\n", FLAG_START_CHAR, f.name, f.usage, v^)
|
||||||
case ^int:
|
case ^int:
|
||||||
fmt.printfln("\t-%s:\n\t\t%s (default: %d)\n", f.name, f.usage, v^)
|
fmt.printfln("\t%s%s:\n\t\t%s (default: %d)\n", FLAG_START_CHAR, f.name, f.usage, v^)
|
||||||
case ^string:
|
case ^string:
|
||||||
fmt.printfln("\t-%s:\n\t\t%s (default: %s)\n", f.name, f.usage, v^)
|
fmt.printfln("\t%s%s:\n\t\t%s (default: %s)\n", FLAG_START_CHAR, f.name, f.usage, v^)
|
||||||
case ^f32:
|
case ^f32:
|
||||||
fmt.printfln("\t-%s:\n\t\t%s (default: %f)\n", f.name, f.usage, v^)
|
fmt.printfln("\t%s%s:\n\t\t%s (default: %f)\n", FLAG_START_CHAR, f.name, f.usage, v^)
|
||||||
case ^f64:
|
case ^f64:
|
||||||
fmt.printfln("\t-%s:\n\t\t%s (default: %f)\n", f.name, f.usage, v^)
|
fmt.printfln("\t%s%s:\n\t\t%s (default: %f)\n", FLAG_START_CHAR, f.name, f.usage, v^)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
os.exit(0)
|
os.exit(0)
|
||||||
@ -94,22 +98,27 @@ parse_flags :: proc() {
|
|||||||
if len(os.args) < 2 && FORCE_HELP_ON_EMPTY_ARGS {print_usage()}
|
if len(os.args) < 2 && FORCE_HELP_ON_EMPTY_ARGS {print_usage()}
|
||||||
|
|
||||||
for &a in os.args {
|
for &a in os.args {
|
||||||
if a == "-help" || a == "--help" {print_usage()}
|
if a == "-h" || a == "-help" || a == "--help" {print_usage()}
|
||||||
if a == os.args[0] {continue}
|
if a == os.args[0] {continue}
|
||||||
|
|
||||||
for &f in all_flags {
|
for &f in all_flags {
|
||||||
if f.parsed {continue}
|
if f.parsed {continue}
|
||||||
a = strings.trim_prefix(a, "-")
|
//a = strings.trim_prefix(a, "-")
|
||||||
|
a = strings.trim_prefix(a, FLAG_START_CHAR)
|
||||||
|
|
||||||
name := a
|
name := a
|
||||||
value: string
|
value: string
|
||||||
|
|
||||||
split := strings.index_any(a, "=")
|
//split := strings.index_any(a, "=")
|
||||||
|
split := strings.index_any(a, FLAG_SEP_CHAR)
|
||||||
if split >= 0 {
|
if split >= 0 {
|
||||||
name = a[:split]
|
name = a[:split]
|
||||||
value = a[split + 1:]
|
value = a[split + 1:]
|
||||||
} else {
|
} else {
|
||||||
name = a
|
name = a
|
||||||
|
fmt.printf("[INFO]: Could not read flag: %s. ", name)
|
||||||
|
fmt.printfln("Want %s<flag>%s<value>\n", FLAG_START_CHAR, FLAG_SEP_CHAR)
|
||||||
|
break
|
||||||
}
|
}
|
||||||
|
|
||||||
if name == f.name && !f.parsed {
|
if name == f.name && !f.parsed {
|
||||||
@ -119,7 +128,8 @@ parse_flags :: proc() {
|
|||||||
if value == "" {break}
|
if value == "" {break}
|
||||||
parsed, ok := strconv.parse_bool(value)
|
parsed, ok := strconv.parse_bool(value)
|
||||||
if !ok {
|
if !ok {
|
||||||
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted bool", f.name, value)
|
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted bool",
|
||||||
|
f.name, value)
|
||||||
os.exit(1)
|
os.exit(1)
|
||||||
}
|
}
|
||||||
v^ = parsed
|
v^ = parsed
|
||||||
@ -128,7 +138,8 @@ parse_flags :: proc() {
|
|||||||
if value == "" {break}
|
if value == "" {break}
|
||||||
parsed, ok := strconv.parse_int(value)
|
parsed, ok := strconv.parse_int(value)
|
||||||
if !ok {
|
if !ok {
|
||||||
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted int", f.name, value)
|
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted int",
|
||||||
|
f.name, value)
|
||||||
os.exit(1)
|
os.exit(1)
|
||||||
}
|
}
|
||||||
v^ = parsed
|
v^ = parsed
|
||||||
@ -142,7 +153,8 @@ parse_flags :: proc() {
|
|||||||
if value == "" {break}
|
if value == "" {break}
|
||||||
parsed, ok := strconv.parse_f32(value)
|
parsed, ok := strconv.parse_f32(value)
|
||||||
if !ok {
|
if !ok {
|
||||||
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted f32", f.name, value)
|
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted f32",
|
||||||
|
f.name, value)
|
||||||
os.exit(1)
|
os.exit(1)
|
||||||
}
|
}
|
||||||
v^ = parsed
|
v^ = parsed
|
||||||
@ -151,7 +163,8 @@ parse_flags :: proc() {
|
|||||||
if value == "" {break}
|
if value == "" {break}
|
||||||
parsed, ok := strconv.parse_f64(value)
|
parsed, ok := strconv.parse_f64(value)
|
||||||
if !ok {
|
if !ok {
|
||||||
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted f64", f.name, value)
|
fmt.fprintfln(os.stderr, "[ERROR] Failed to parse flag %s: got %T, wanted f64",
|
||||||
|
f.name, value)
|
||||||
os.exit(1)
|
os.exit(1)
|
||||||
}
|
}
|
||||||
v^ = parsed
|
v^ = parsed
|
||||||
|
|||||||
@ -14,6 +14,10 @@ main :: proc(){
|
|||||||
fleg.init_custom_allocator(arena_alloc)
|
fleg.init_custom_allocator(arena_alloc)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
fleg.FLAG_START_CHAR = "--"
|
||||||
|
fleg.FLAG_SEP_CHAR = ":"
|
||||||
|
fleg.FORCE_HELP_ON_EMPTY_ARGS = true
|
||||||
|
|
||||||
defer fleg.destroy()
|
defer fleg.destroy()
|
||||||
isRunning: bool
|
isRunning: bool
|
||||||
isNumber: int
|
isNumber: int
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user