Skip to content

Commit befe075

Browse files
committed
commands: adapt to command & p9 API changes
This changes signatures of execute functions to accept a slice of "options" instead of a type of "settings", effectively shifting the responsibility of initializing default settings and applying modifications; into the execute function itself, rather than relying on the caller to do so correctly and consistently. I.e. empty calls from the CLI and Go API should always have the same behaviour. In addition, lazy initialization can be done later (and more clearly), if needed at all. Help text has been populated and formatted in a way that should look acceptable when printed on ASCII typewriters, as well as ANSI terminals. Some of the constraints for `p9` changed slightly, so calls have been updated.
1 parent 1865e29 commit befe075

14 files changed

+1360
-1002
lines changed

internal/commands/client.go

Lines changed: 57 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ type (
2424
clientSettings struct {
2525
serviceMaddr multiaddr.Multiaddr
2626
exitInterval time.Duration
27-
commonSettings
27+
sharedSettings
2828
}
29+
clientOption func(*clientSettings) error
30+
clientOptions []clientOption
2931
// defaultClientMaddr distinguishes
3032
// the default maddr value, from an arbitrary maddr value.
3133
// I.e. even if the underlying multiaddrs are the same
@@ -34,57 +36,80 @@ type (
3436
defaultClientMaddr struct{ multiaddr.Multiaddr }
3537
)
3638

37-
const errServiceNotFound = generic.ConstError("could not find service instance")
39+
const (
40+
exitIntervalDefault = 30 * time.Second
41+
errServiceNotFound = generic.ConstError("could not find service instance")
42+
)
3843

39-
func (set *clientSettings) getClient(autoLaunchDaemon bool) (*Client, error) {
44+
func (cs *clientSettings) getClient(autoLaunchDaemon bool) (*Client, error) {
4045
var (
41-
serviceMaddr = set.serviceMaddr
46+
serviceMaddr = cs.serviceMaddr
4247
clientOpts []p9.ClientOpt
4348
)
44-
if set.verbose {
49+
if cs.verbose {
4550
// TODO: less fancy prefix and/or out+prefix from CLI flags
4651
clientLog := log.New(os.Stdout, "⬇️ client - ", log.Lshortfile)
4752
clientOpts = append(clientOpts, p9.WithClientLogger(clientLog))
4853
}
4954
if autoLaunchDaemon {
5055
if _, wasUnset := serviceMaddr.(defaultClientMaddr); wasUnset {
51-
return connectOrLaunchLocal(set.exitInterval, clientOpts...)
56+
return connectOrLaunchLocal(cs.exitInterval, clientOpts...)
5257
}
5358
}
5459
return Connect(serviceMaddr, clientOpts...)
5560
}
5661

57-
func (set *clientSettings) BindFlags(flagSet *flag.FlagSet) {
58-
set.commonSettings.BindFlags(flagSet)
62+
func (co *clientOptions) BindFlags(flagSet *flag.FlagSet) {
63+
var sharedOptions sharedOptions
64+
(&sharedOptions).BindFlags(flagSet)
65+
*co = append(*co, func(cs *clientSettings) error {
66+
subset, err := sharedOptions.make()
67+
if err != nil {
68+
return err
69+
}
70+
cs.sharedSettings = subset
71+
return nil
72+
})
5973
const (
60-
exitFlag = exitAfterFlagName
74+
exitName = exitAfterFlagName
6175
exitUsage = "passed to the daemon command if we launch it" +
6276
"\n(refer to daemon's helptext)"
63-
exitAfterDefault = 30 * time.Second
6477
)
65-
flagSet.DurationVar(&set.exitInterval, exitFlag, exitAfterDefault, exitUsage)
66-
const (
67-
sockName = serverFlagName
68-
sockUsage = "file system service `maddr`" +
69-
"\n\b" // Newline for default value, sans space.
70-
)
71-
var sockDefaultText string
72-
{
73-
maddrs, err := userServiceMaddrs()
74-
if err != nil {
75-
panic(err)
76-
}
77-
sockDefault := maddrs[0]
78-
sockDefaultText = sockDefault.String()
79-
set.serviceMaddr = defaultClientMaddr{sockDefault}
78+
flagSetFunc(flagSet, exitName, exitUsage, co,
79+
func(value time.Duration, settings *clientSettings) error {
80+
settings.exitInterval = value
81+
return nil
82+
})
83+
flagSet.Lookup(exitName).
84+
DefValue = exitIntervalDefault.String()
85+
const serverUsage = "file system service `maddr`"
86+
flagSetFunc(flagSet, serverFlagName, serverUsage, co,
87+
func(value multiaddr.Multiaddr, settings *clientSettings) error {
88+
settings.serviceMaddr = value
89+
return nil
90+
})
91+
flagSet.Lookup(serverFlagName).
92+
DefValue = defaultServerMaddr().String()
93+
}
94+
95+
func (co clientOptions) make() (clientSettings, error) {
96+
settings := clientSettings{
97+
exitInterval: exitIntervalDefault,
8098
}
81-
flagSet.Func(sockName, sockUsage, func(s string) (err error) {
82-
set.serviceMaddr, err = multiaddr.NewMultiaddr(s)
83-
return
84-
})
85-
setDefaultValueText(flagSet, flagDefaultText{
86-
sockName: sockDefaultText,
87-
})
99+
if err := applyOptions(&settings, co...); err != nil {
100+
return clientSettings{}, err
101+
}
102+
if err := settings.fillDefaults(); err != nil {
103+
return clientSettings{}, err
104+
}
105+
return settings, nil
106+
}
107+
108+
func (cs *clientSettings) fillDefaults() error {
109+
if cs.serviceMaddr == nil {
110+
cs.serviceMaddr = defaultServerMaddr()
111+
}
112+
return nil
88113
}
89114

90115
func (c *Client) getListeners() ([]multiaddr.Multiaddr, error) {

0 commit comments

Comments
 (0)