func bootstrapMarshaler(res cmds.Response) (io.Reader, error) { v, ok := res.Output().(*BootstrapOutput) if !ok { return nil, u.ErrCast() } buf := new(bytes.Buffer) err := bootstrapWritePeers(buf, "", v.Peers) return buf, err }
// value accessor methods, gets the value as a certain type func (ov OptionValue) Bool() (value bool, found bool, err error) { if !ov.found { return false, false, nil } val, ok := ov.value.(bool) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (ov OptionValue) Float() (value float64, found bool, err error) { if !ov.found { return 0, false, nil } val, ok := ov.value.(float64) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (ov OptionValue) String() (value string, found bool, err error) { if !ov.found { return "", false, nil } val, ok := ov.value.(string) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (ov OptionValue) Uint() (value uint, found bool, err error) { if !ov.found { return 0, false, nil } val, ok := ov.value.(uint) if !ok { err = util.ErrCast() } return val, ov.found, err }
func (r *request) ConvertOptions() error { for k, v := range r.options { opt, ok := r.optionDefs[k] if !ok { continue } kind := reflect.TypeOf(v).Kind() if kind != opt.Type() { if kind == String { convert := converters[opt.Type()] str, ok := v.(string) if !ok { return u.ErrCast() } val, err := convert(str) if err != nil { value := fmt.Sprintf("value '%v'", v) if len(str) == 0 { value = "empty value" } return fmt.Errorf("Could not convert %s to type '%s' (for option '-%s')", value, opt.Type().String(), k) } r.options[k] = val } else { return fmt.Errorf("Option '%s' should be type '%s', but got type '%s'", k, opt.Type().String(), kind.String()) } } else { r.options[k] = v } for _, name := range opt.Names() { if _, ok := r.options[name]; name != k && ok { return fmt.Errorf("Duplicate command options were provided ('%s' and '%s')", k, name) } } } return nil }
// Parse parses the input commandline string (cmd, flags, and args). // returns the corresponding command Request object. func Parse(input []string, stdin *os.File, root *cmds.Command) (cmds.Request, *cmds.Command, []string, error) { path, opts, stringVals, cmd, err := parseOpts(input, root) if err != nil { return nil, nil, path, err } optDefs, err := root.GetOptions(path) if err != nil { return nil, cmd, path, err } req, err := cmds.NewRequest(path, opts, nil, nil, cmd, optDefs) if err != nil { return nil, cmd, path, err } // if -r is provided, and it is associated with the package builtin // recursive path option, allow recursive file paths recursiveOpt := req.Option(cmds.RecShort) recursive := false if recursiveOpt != nil && recursiveOpt.Definition() == cmds.OptionRecursivePath { recursive, _, err = recursiveOpt.Bool() if err != nil { return req, nil, nil, u.ErrCast() } } stringArgs, fileArgs, err := parseArgs(stringVals, stdin, cmd.Arguments, recursive, root) if err != nil { return req, cmd, path, err } req.SetArguments(stringArgs) file := files.NewSliceFile("", "", fileArgs) req.SetFiles(file) err = cmd.CheckArguments(req) if err != nil { return req, cmd, path, err } return req, cmd, path, nil }
return } } name := req.Arguments()[0] recursive, _, _ := req.Option("recursive").Bool() depth := 1 if recursive { depth = namesys.DefaultDepthLimit } output, err := n.Namesys.ResolveN(req.Context(), name, depth) if err != nil { res.SetError(err, cmds.ErrNormal) return } res.SetOutput(&ResolvedPath{output}) }, Marshalers: cmds.MarshalerMap{ cmds.Text: func(res cmds.Response) (io.Reader, error) { output, ok := res.Output().(*ResolvedPath) if !ok { return nil, u.ErrCast() } return strings.NewReader(output.Path.String()), nil }, }, Type: ResolvedPath{}, }
cmds.BoolOption("recursive", "r", "Resolve until the result is not a DNS link"), }, Run: func(req cmds.Request, res cmds.Response) { recursive, _, _ := req.Option("recursive").Bool() name := req.Arguments()[0] resolver := namesys.NewDNSResolver() depth := 1 if recursive { depth = namesys.DefaultDepthLimit } output, err := resolver.ResolveN(req.Context(), name, depth) if err != nil { res.SetError(err, cmds.ErrNormal) return } res.SetOutput(&ResolvedPath{output}) }, Marshalers: cmds.MarshalerMap{ cmds.Text: func(res cmds.Response) (io.Reader, error) { output, ok := res.Output().(*ResolvedPath) if !ok { return nil, util.ErrCast() } return strings.NewReader(output.Path.String()), nil }, }, Type: ResolvedPath{}, }
go func() { defer close(outChan) if err := addAllAndPin(req.Files()); err != nil { res.SetError(err, cmds.ErrNormal) return } }() }, PostRun: func(req cmds.Request, res cmds.Response) { if res.Error() != nil { return } outChan, ok := res.Output().(<-chan interface{}) if !ok { res.SetError(u.ErrCast(), cmds.ErrNormal) return } res.SetOutput(nil) quiet, _, err := req.Option("quiet").Bool() if err != nil { res.SetError(u.ErrCast(), cmds.ErrNormal) return } size := int64(0) s, found := req.Values()["size"] if found { size = s.(int64) }
}, Run: func(req cmds.Request, res cmds.Response) { nd, err := req.InvocContext().GetNode() if err != nil { res.SetError(err, cmds.ErrNormal) return } if !nd.OnlineMode() { res.SetError(errNotOnline, cmds.ErrClient) return } bs, ok := nd.Exchange.(*bitswap.Bitswap) if !ok { res.SetError(u.ErrCast(), cmds.ErrNormal) return } var ks []key.Key for _, arg := range req.Arguments() { dec := key.B58KeyDecode(arg) if dec == "" { res.SetError(fmt.Errorf("incorrectly formatted key: %s", arg), cmds.ErrNormal) return } ks = append(ks, dec) } bs.CancelWants(ks)