|
| 1 | +package commands |
| 2 | + |
| 3 | +import ( |
| 4 | + "encoding/json" |
| 5 | + "flag" |
| 6 | + "fmt" |
| 7 | + |
| 8 | + "github.com/djdv/go-filesystem-utils/internal/command" |
| 9 | + "github.com/djdv/go-filesystem-utils/internal/filesystem" |
| 10 | + p9fs "github.com/djdv/go-filesystem-utils/internal/filesystem/9p" |
| 11 | + "github.com/multiformats/go-multiaddr" |
| 12 | +) |
| 13 | + |
| 14 | +type ( |
| 15 | + plan9GuestSettings p9fs.Guest |
| 16 | + plan9GuestOption func(*plan9GuestSettings) error |
| 17 | + plan9GuestOptions []plan9GuestOption |
| 18 | +) |
| 19 | + |
| 20 | +const p9GuestSrvFlagName = "server" |
| 21 | + |
| 22 | +func makePlan9GuestCommand[ |
| 23 | + HC mountCmdHost[HT, HM], |
| 24 | + HM marshaller, |
| 25 | + HT any, |
| 26 | +](host filesystem.Host, |
| 27 | +) command.Command { |
| 28 | + return makeMountCommand[HC, HM, plan9GuestOptions, plan9GuestSettings](host, p9fs.GuestID) |
| 29 | +} |
| 30 | + |
| 31 | +func (*plan9GuestOptions) usage(filesystem.Host) string { |
| 32 | + return string(p9fs.GuestID) + " attaches to a 9P file server" |
| 33 | +} |
| 34 | + |
| 35 | +func (o9 *plan9GuestOptions) BindFlags(flagSet *flag.FlagSet) { |
| 36 | + var ( |
| 37 | + flagPrefix = prefixIDFlag(p9fs.GuestID) |
| 38 | + srvUsage = "9P2000.L file system server `maddr`" |
| 39 | + srvName = flagPrefix + p9GuestSrvFlagName |
| 40 | + ) |
| 41 | + flagSetFunc(flagSet, srvName, srvUsage, o9, |
| 42 | + func(value multiaddr.Multiaddr, settings *plan9GuestSettings) error { |
| 43 | + settings.Maddr = value |
| 44 | + return nil |
| 45 | + }) |
| 46 | +} |
| 47 | + |
| 48 | +func (o9 plan9GuestOptions) make() (plan9GuestSettings, error) { |
| 49 | + settings, err := makeWithOptions(o9...) |
| 50 | + if err != nil { |
| 51 | + return plan9GuestSettings{}, err |
| 52 | + } |
| 53 | + if settings.Maddr == nil { |
| 54 | + var ( |
| 55 | + flagPrefix = prefixIDFlag(p9fs.GuestID) |
| 56 | + srvName = flagPrefix + p9GuestSrvFlagName |
| 57 | + ) |
| 58 | + return plan9GuestSettings{}, fmt.Errorf( |
| 59 | + "flag `-%s` must be provided for 9P guests", |
| 60 | + srvName, |
| 61 | + ) |
| 62 | + } |
| 63 | + return settings, nil |
| 64 | +} |
| 65 | + |
| 66 | +func (s9 plan9GuestSettings) marshal(string) ([]byte, error) { |
| 67 | + return json.Marshal(s9) |
| 68 | +} |
0 commit comments