mirror of
https://github.com/ipfs/kubo.git
synced 2025-05-21 08:56:37 +08:00
220 lines
4.8 KiB
Go
220 lines
4.8 KiB
Go
package legacy
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io"
|
|
"os"
|
|
"reflect"
|
|
|
|
"gx/ipfs/Qmc5paX4ECBARnAKkcAmUYHBGor228Tkfxeya3Nu2KRL46/go-ipfs-cmds"
|
|
"gx/ipfs/QmceUdzxkimdYsgtX733uNgzf1DLHyBKN6ehGSp85ayppM/go-ipfs-cmdkit"
|
|
"gx/ipfs/QmceUdzxkimdYsgtX733uNgzf1DLHyBKN6ehGSp85ayppM/go-ipfs-cmdkit/files"
|
|
|
|
oldcmds "github.com/ipfs/go-ipfs/commands"
|
|
)
|
|
|
|
// requestWrapper implements a oldcmds.Request from an Request
|
|
type requestWrapper struct {
|
|
req *cmds.Request
|
|
ctx *oldcmds.Context
|
|
}
|
|
|
|
func (r *requestWrapper) String() string {
|
|
return fmt.Sprintf("{%v, %v}", r.req, r.ctx)
|
|
}
|
|
|
|
func (r *requestWrapper) GoString() string {
|
|
return fmt.Sprintf("lgc.Request{%#v, %#v}", r.req, r.ctx)
|
|
}
|
|
|
|
// InvocContext retuns the invocation context of the oldcmds.Request.
|
|
// It is faked using OldContext().
|
|
func (r *requestWrapper) InvocContext() *oldcmds.Context {
|
|
return r.ctx
|
|
}
|
|
|
|
// SetInvocContext sets the invocation context. First the context is converted
|
|
// to a Context using NewContext().
|
|
func (r *requestWrapper) SetInvocContext(ctx oldcmds.Context) {
|
|
r.ctx = &ctx
|
|
}
|
|
|
|
// Command is an empty stub.
|
|
func (r *requestWrapper) Command() *oldcmds.Command { return nil }
|
|
|
|
func (r *requestWrapper) Arguments() []string {
|
|
cmdArgs := r.req.Command.Arguments
|
|
reqArgs := r.req.Arguments
|
|
|
|
// TODO figure out the exaclt policy for when to use these automatically
|
|
// TODO once that's done, change the log.Debug below to log.Error
|
|
// read arguments from body if we don't have all of them or the command has variadic arguemnts
|
|
if len(reqArgs) < len(cmdArgs) ||
|
|
len(cmdArgs) > 0 && cmdArgs[len(cmdArgs)-1].Variadic {
|
|
err := r.req.ParseBodyArgs()
|
|
if err != nil {
|
|
log.Debug("error reading arguments from stdin: ", err)
|
|
}
|
|
}
|
|
return r.req.Arguments
|
|
}
|
|
|
|
func (r *requestWrapper) Context() context.Context {
|
|
return r.req.Context
|
|
}
|
|
|
|
func (r *requestWrapper) ConvertOptions() error {
|
|
return convertOptions(r.req)
|
|
}
|
|
|
|
func (r *requestWrapper) Files() files.File {
|
|
return r.req.Files
|
|
}
|
|
|
|
func (r *requestWrapper) Option(name string) *cmdkit.OptionValue {
|
|
var option cmdkit.Option
|
|
|
|
optDefs, err := r.req.Root.GetOptions(r.req.Path)
|
|
if err != nil {
|
|
return &cmdkit.OptionValue{nil, false, nil}
|
|
}
|
|
for _, def := range optDefs {
|
|
for _, optName := range def.Names() {
|
|
if name == optName {
|
|
option = def
|
|
break
|
|
}
|
|
}
|
|
}
|
|
if option == nil {
|
|
return nil
|
|
}
|
|
|
|
// try all the possible names, break if we find a value
|
|
for _, n := range option.Names() {
|
|
val, found := r.req.Options[n]
|
|
if found {
|
|
return &cmdkit.OptionValue{val, found, option}
|
|
}
|
|
}
|
|
|
|
return &cmdkit.OptionValue{option.Default(), false, option}
|
|
}
|
|
|
|
func (r *requestWrapper) Options() cmdkit.OptMap {
|
|
return r.req.Options
|
|
}
|
|
|
|
func (r *requestWrapper) Path() []string {
|
|
return r.req.Path
|
|
}
|
|
|
|
func (r *requestWrapper) SetArguments(args []string) {
|
|
r.req.Arguments = args
|
|
}
|
|
|
|
func (r *requestWrapper) SetFiles(f files.File) {
|
|
r.req.Files = f
|
|
}
|
|
|
|
func (r *requestWrapper) SetOption(name string, v interface{}) {
|
|
r.req.SetOption(name, v)
|
|
}
|
|
|
|
func (r *requestWrapper) SetOptions(om cmdkit.OptMap) error {
|
|
r.req.Options = om
|
|
return convertOptions(r.req)
|
|
}
|
|
|
|
func (r *requestWrapper) SetRootContext(ctx context.Context) error {
|
|
r.req.Context = ctx
|
|
return nil
|
|
}
|
|
|
|
func (r *requestWrapper) Stdin() io.Reader {
|
|
return os.Stdin
|
|
}
|
|
|
|
func (r *requestWrapper) StringArguments() []string {
|
|
return r.req.Arguments
|
|
}
|
|
|
|
func (r *requestWrapper) Values() map[string]interface{} {
|
|
return nil
|
|
}
|
|
|
|
func (r *requestWrapper) VarArgs(f func(string) error) error {
|
|
if len(r.req.Arguments) >= len(r.req.Command.Arguments) {
|
|
for _, arg := range r.req.Arguments {
|
|
err := f(arg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
s, err := r.req.BodyArgs()
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
for s.Scan() {
|
|
err = f(s.Text())
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
// copied from go-ipfs-cmds/request.go
|
|
func convertOptions(req *cmds.Request) error {
|
|
optDefSlice := req.Command.Options
|
|
|
|
optDefs := make(map[string]cmdkit.Option)
|
|
for _, def := range optDefSlice {
|
|
for _, name := range def.Names() {
|
|
optDefs[name] = def
|
|
}
|
|
}
|
|
|
|
for k, v := range req.Options {
|
|
opt, ok := optDefs[k]
|
|
if !ok {
|
|
continue
|
|
}
|
|
|
|
kind := reflect.TypeOf(v).Kind()
|
|
if kind != opt.Type() {
|
|
if str, ok := v.(string); ok {
|
|
val, err := opt.Parse(str)
|
|
if err != nil {
|
|
value := fmt.Sprintf("value %q", v)
|
|
if len(str) == 0 {
|
|
value = "empty value"
|
|
}
|
|
return fmt.Errorf("Could not convert %q to type %q (for option %q)",
|
|
value, opt.Type().String(), "-"+k)
|
|
}
|
|
req.Options[k] = val
|
|
|
|
} else {
|
|
return fmt.Errorf("Option %q should be type %q, but got type %q",
|
|
k, opt.Type().String(), kind.String())
|
|
}
|
|
}
|
|
|
|
for _, name := range opt.Names() {
|
|
if _, ok := req.Options[name]; name != k && ok {
|
|
return fmt.Errorf("Duplicate command options were provided (%q and %q)",
|
|
k, name)
|
|
}
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|