Skip to content

Commit

Permalink
refactor: create helper function to add options from registries
Browse files Browse the repository at this point in the history
  • Loading branch information
mikhailswift committed Aug 10, 2023
1 parent 88a8d93 commit d713711
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 98 deletions.
72 changes: 71 additions & 1 deletion options/options.go
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,79 @@

package options

import "github.com/spf13/cobra"
import (
"fmt"
"time"

"github.com/spf13/cobra"
"github.com/testifysec/go-witness/log"
"github.com/testifysec/go-witness/registry"
)

type Interface interface {
// AddFlags adds this options' flags to the cobra command.
AddFlags(cmd *cobra.Command)
}

func addFlagsFromRegistry[T any](prefix string, registrationEntries []registry.Entry[T], cmd *cobra.Command) map[string][]func(T) (T, error) {
optSettersByName := make(map[string][]func(T) (T, error))

for _, registration := range registrationEntries {
for _, opt := range registration.Options {
name := fmt.Sprintf("%s-%s-%s", prefix, registration.Name, opt.Name())
switch optT := opt.(type) {
case *registry.ConfigOption[T, int]:
{
val := cmd.Flags().Int(name, optT.DefaultVal(), opt.Description())
optSettersByName[registration.Name] = append(optSettersByName[registration.Name], func(a T) (T, error) {
return optT.Setter()(a, *val)
})
}

case *registry.ConfigOption[T, string]:
{
// this is kind of a hacky solution to maintain backward compatibility with the old "-k" flag
var val *string
if name == "signer-file-key-path" {
val = cmd.Flags().StringP(name, "k", optT.DefaultVal(), optT.Description())
} else {
val = cmd.Flags().String(name, optT.DefaultVal(), opt.Description())
}

optSettersByName[registration.Name] = append(optSettersByName[registration.Name], func(a T) (T, error) {
return optT.Setter()(a, *val)
})
}

case *registry.ConfigOption[T, []string]:
{
val := cmd.Flags().StringSlice(name, optT.DefaultVal(), opt.Description())
optSettersByName[registration.Name] = append(optSettersByName[registration.Name], func(a T) (T, error) {
return optT.Setter()(a, *val)
})
}

case *registry.ConfigOption[T, bool]:
{
val := cmd.Flags().Bool(name, optT.DefaultVal(), opt.Description())
optSettersByName[registration.Name] = append(optSettersByName[registration.Name], func(a T) (T, error) {
return optT.Setter()(a, *val)
})
}

case *registry.ConfigOption[T, time.Duration]:
{
val := cmd.Flags().Duration(name, optT.DefaultVal(), opt.Description())
optSettersByName[registration.Name] = append(optSettersByName[registration.Name], func(a T) (T, error) {
return optT.Setter()(a, *val)
})
}

default:
log.Debugf("unrecognized attestor option type: %T", optT)
}
}
}

return optSettersByName
}
45 changes: 1 addition & 44 deletions options/run.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,9 @@
package options

import (
"fmt"

"github.com/spf13/cobra"
"github.com/testifysec/go-witness/attestation"
"github.com/testifysec/go-witness/log"
"github.com/testifysec/go-witness/registry"
)

type RunOptions struct {
Expand All @@ -46,47 +43,7 @@ func (ro *RunOptions) AddFlags(cmd *cobra.Command) {
cmd.Flags().StringSliceVar(&ro.TimestampServers, "timestamp-servers", []string{}, "Timestamp Authority Servers to use when signing envelope")

attestationRegistrations := attestation.RegistrationEntries()
for _, registration := range attestationRegistrations {
for _, opt := range registration.Options {
name := fmt.Sprintf("attestor-%s-%s", registration.Name, opt.Name())
switch optT := opt.(type) {
case *registry.ConfigOption[attestation.Attestor, int]:
{
val := cmd.Flags().Int(name, optT.DefaultVal(), opt.Description())
ro.AttestorOptSetters[registration.Name] = append(ro.AttestorOptSetters[registration.Name], func(a attestation.Attestor) (attestation.Attestor, error) {
return optT.Setter()(a, *val)
})
}

case *registry.ConfigOption[attestation.Attestor, string]:
{
val := cmd.Flags().String(name, optT.DefaultVal(), opt.Description())
ro.AttestorOptSetters[registration.Name] = append(ro.AttestorOptSetters[registration.Name], func(a attestation.Attestor) (attestation.Attestor, error) {
return optT.Setter()(a, *val)
})
}

case *registry.ConfigOption[attestation.Attestor, []string]:
{
val := cmd.Flags().StringSlice(name, optT.DefaultVal(), opt.Description())
ro.AttestorOptSetters[registration.Name] = append(ro.AttestorOptSetters[registration.Name], func(a attestation.Attestor) (attestation.Attestor, error) {
return optT.Setter()(a, *val)
})
}

case *registry.ConfigOption[attestation.Attestor, bool]:
{
val := cmd.Flags().Bool(name, optT.DefaultVal(), opt.Description())
ro.AttestorOptSetters[registration.Name] = append(ro.AttestorOptSetters[registration.Name], func(a attestation.Attestor) (attestation.Attestor, error) {
return optT.Setter()(a, *val)
})
}

default:
log.Debugf("unrecognized attestor option type: %T", optT)
}
}
}
ro.AttestorOptSetters = addFlagsFromRegistry("attestor", attestationRegistrations, cmd)
}

type ArchivistaOptions struct {
Expand Down
55 changes: 2 additions & 53 deletions options/signers.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,64 +15,13 @@
package options

import (
"fmt"

"github.com/spf13/cobra"
"github.com/testifysec/go-witness/log"
"github.com/testifysec/go-witness/registry"
"github.com/testifysec/go-witness/signer"
)

type SignerOptions map[string][]func(signer.SignerProvider) (signer.SignerProvider, error)

func (so SignerOptions) AddFlags(cmd *cobra.Command) {
func (so *SignerOptions) AddFlags(cmd *cobra.Command) {
signerRegistrations := signer.RegistryEntries()
for _, registration := range signerRegistrations {
for _, opt := range registration.Options {
name := fmt.Sprintf("signer-%s-%s", registration.Name, opt.Name())
switch optT := opt.(type) {
case *registry.ConfigOption[signer.SignerProvider, int]:
{
val := cmd.Flags().Int(name, optT.DefaultVal(), opt.Description())
so[registration.Name] = append(so[registration.Name], func(sp signer.SignerProvider) (signer.SignerProvider, error) {
return optT.Setter()(sp, *val)
})
}

case *registry.ConfigOption[signer.SignerProvider, string]:
{
// this is kind of a hacky solution to maintain backward compatibility with the old "-k" flag
var val *string
if name == "signer-file-key-path" {
val = cmd.Flags().StringP(name, "k", optT.DefaultVal(), optT.Description())
} else {
val = cmd.Flags().String(name, optT.DefaultVal(), opt.Description())
}

so[registration.Name] = append(so[registration.Name], func(sp signer.SignerProvider) (signer.SignerProvider, error) {
return optT.Setter()(sp, *val)
})
}

case *registry.ConfigOption[signer.SignerProvider, []string]:
{
val := cmd.Flags().StringSlice(name, optT.DefaultVal(), opt.Description())
so[registration.Name] = append(so[registration.Name], func(sp signer.SignerProvider) (signer.SignerProvider, error) {
return optT.Setter()(sp, *val)
})
}

case *registry.ConfigOption[signer.SignerProvider, bool]:
{
val := cmd.Flags().Bool(name, optT.DefaultVal(), opt.Description())
so[registration.Name] = append(so[registration.Name], func(sp signer.SignerProvider) (signer.SignerProvider, error) {
return optT.Setter()(sp, *val)
})
}

default:
log.Debugf("unrecognized signer option type: %T", optT)
}
}
}
*so = addFlagsFromRegistry("signer", signerRegistrations, cmd)
}

0 comments on commit d713711

Please sign in to comment.