func getDriverOpts(c *cli.Context, mcnflags []mcnflag.Flag) drivers.DriverOptions { // TODO: This function is pretty damn YOLO and would benefit from some // sanity checking around types and assertions. // // But, we need it so that we can actually send the flags for creating // a machine over the wire (cli.Context is a no go since there is so // much stuff in it). driverOpts := rpcdriver.RpcFlags{ Values: make(map[string]interface{}), } for _, f := range mcnflags { driverOpts.Values[f.String()] = f.Default() // Hardcoded logic for boolean... :( if f.Default() == nil { driverOpts.Values[f.String()] = false } } for _, name := range c.FlagNames() { getter, ok := c.Generic(name).(flag.Getter) if !ok { // TODO: This is pretty hacky. StringSlice is the only // type so far we have to worry about which is not a // Getter, though. driverOpts.Values[name] = c.StringSlice(name) continue } driverOpts.Values[name] = getter.Get() } return driverOpts }