diff --git a/flagzog/flags.go b/flagzog/flags.go new file mode 100644 index 0000000..071d16f --- /dev/null +++ b/flagzog/flags.go @@ -0,0 +1,109 @@ +package flagzog + +import ( + "fmt" + + "github.com/Oudwins/zog" +) + +func NewBoolFlag(name string, schema *zog.BoolSchema[bool], usage string) BoolFlag { + return BoolFlag{ + name: name, + schema: schema, + usage: usage, + } +} + +type BoolFlag struct { + name string + schema *zog.BoolSchema[bool] + usage string + Value bool +} + +func (f BoolFlag) Name() string { + return f.name +} + +func (f BoolFlag) Usage() string { + return f.usage +} + +func (f BoolFlag) Validate() ([]string, error) { + var messages []string + if issues := f.schema.Validate(&f.Value); issues != nil { + for _, issue := range issues { + messages = append(messages, issue.Message) + } + return messages, fmt.Errorf("validation failed for flag '%s' with value '%s'", f.Name(), f.Value) + } + return messages, nil +} + +func NewInt64Flag(name string, schema *zog.NumberSchema[int64], usage string) Int64Flag { + return Int64Flag{ + name: name, + schema: schema, + usage: usage, + } +} + +type Int64Flag struct { + name string + schema *zog.NumberSchema[int64] + usage string + Value int64 +} + +func (f Int64Flag) Name() string { + return f.name +} + +func (f Int64Flag) Usage() string { + return f.usage +} + +func (f Int64Flag) Validate() ([]string, error) { + var messages []string + if issues := f.schema.Validate(&f.Value); issues != nil { + for _, issue := range issues { + messages = append(messages, issue.Message) + } + return messages, fmt.Errorf("validation failed for flag '%s' with value '%s'", f.Name(), f.Value) + } + return messages, nil +} + +func NewStringFlag(name string, schema *zog.StringSchema[string], usage string) StringFlag { + return StringFlag{ + name: name, + schema: schema, + usage: usage, + } +} + +type StringFlag struct { + name string + schema *zog.StringSchema[string] + usage string + Value string +} + +func (f StringFlag) Name() string { + return f.name +} + +func (f StringFlag) Usage() string { + return f.usage +} + +func (f StringFlag) Validate() ([]string, error) { + var messages []string + if issues := f.schema.Validate(&f.Value); issues != nil { + for _, issue := range issues { + messages = append(messages, issue.Message) + } + return messages, fmt.Errorf("validation failed for flag '%s' with value '%s'", f.Name(), f.Value) + } + return messages, nil +} diff --git a/flagzog/validator.go b/flagzog/validator.go new file mode 100644 index 0000000..c2c44b7 --- /dev/null +++ b/flagzog/validator.go @@ -0,0 +1,27 @@ +package flagzog + +import ( + "context" + "log/slog" +) + +type FlagValidator interface { + Name() string + Validate() ([]string, error) + Usage() string +} + +func ValidateFlags(ctx context.Context, logger *slog.Logger, flags []FlagValidator) ([]string, error) { + var validatedFlags []string + var err error + + for _, flag := range flags { + var issues []string + if issues, err = flag.Validate(); err != nil { + logger.Log(ctx, slog.LevelError, "validation failed", slog.String("flag", flag.Name()), slog.Any("issues", issues)) + return validatedFlags, err + } + validatedFlags = append(validatedFlags, flag.Name()) + } + return validatedFlags, nil +}