123456789101112131415161718192021222324252627282930313233343536373839404142434445 |
- package flags
- import "core:fmt"
- import "core:reflect"
- import "core:strconv"
- _ :: fmt
- _ :: reflect
- _ :: strconv
- // Validate that all the required arguments are set.
- validate :: proc(data: ^$T, max_pos: int, set_args: []string) -> Error {
- fields := reflect.struct_fields_zipped(T)
- check_fields: for field in fields {
- tag := reflect.struct_tag_lookup(field.tag, TAG_ARGS) or_continue
- if _, ok := get_struct_subtag(tag, SUBTAG_REQUIRED); ok {
- was_set := false
- // Check if it was set by name.
- check_set_args: for set_arg in set_args {
- if get_field_name(field) == set_arg {
- was_set = true
- break check_set_args
- }
- }
- // Check if it was set by position.
- if pos, has_pos := get_struct_subtag(tag, SUBTAG_POS); has_pos {
- value, value_ok := strconv.parse_int(pos)
- if value < max_pos {
- was_set = true
- }
- }
- if !was_set {
- return Validation_Error {
- fmt.tprintf("required argument `%s` was not set", field.name),
- }
- }
- }
- }
- return nil
- }
|