func ParseArgs(req cmds.Request, inputs []string, stdin *os.File, argDefs []cmds.Argument, root *cmds.Command) ([]string, []files.File, error) { var err error // 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 nil, nil, u.ErrCast() } } // if '--hidden' is provided, enumerate hidden paths hiddenOpt := req.Option("hidden") hidden := false if hiddenOpt != nil { hidden, _, err = hiddenOpt.Bool() if err != nil { return nil, nil, u.ErrCast() } } return parseArgs(inputs, stdin, argDefs, recursive, hidden, root) }
func getPsMsgMarshaler(f func(m *floodsub.Message) (io.Reader, error)) func(cmds.Response) (io.Reader, error) { return func(res cmds.Response) (io.Reader, error) { outChan, ok := res.Output().(<-chan interface{}) if !ok { return nil, u.ErrCast() } marshal := func(v interface{}) (io.Reader, error) { obj, ok := v.(*floodsub.Message) if !ok { return nil, u.ErrCast() } if obj.Message == nil { return strings.NewReader(""), nil } return f(obj) } return &cmds.ChannelMarshaler{ Channel: outChan, Marshaler: marshal, Res: res, }, nil } }
func objectMarshaler(res cmds.Response) (io.Reader, error) { o, ok := res.Output().(*Object) if !ok { return nil, u.ErrCast() } return strings.NewReader(o.Hash + "\n"), nil }
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 }
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 }
depth := 1 if recursive { depth = namesys.DefaultDepthLimit } if !strings.HasPrefix(name, "/ipns/") { name = "/ipns/" + name } output, err := resolver.ResolveN(req.Context(), name, depth) if err != nil { res.SetError(err, cmds.ErrNormal) return } // TODO: better errors (in the case of not finding the name, we get "failed to find any peer in table") 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() + "\n"), 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 } progress, _, err := req.Option(progressOptionName).Bool() if err != nil { res.SetError(u.ErrCast(), cmds.ErrNormal) return }
}, 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 []*cid.Cid for _, arg := range req.Arguments() { c, err := cid.Decode(arg) if err != nil { res.SetError(err, cmds.ErrNormal) return } ks = append(ks, c) } bs.CancelWants(ks)