mirror of
https://github.com/ipfs/kubo.git
synced 2025-08-06 11:31:54 +08:00
143 lines
3.4 KiB
Go
143 lines
3.4 KiB
Go
package dagcmd
|
|
|
|
import (
|
|
"fmt"
|
|
"io"
|
|
"strings"
|
|
|
|
cmds "github.com/ipfs/go-ipfs/commands"
|
|
|
|
node "gx/ipfs/QmRSU5EqqWVZSNdbU51yXmVoF1uNw3JgTNB6RaiL7DZM16/go-ipld-node"
|
|
ipldcbor "gx/ipfs/QmbuuwTd9x4NReZ7sxtiKk7wFcfDUo54MfWBdtF5MRCPGR/go-ipld-cbor"
|
|
cid "gx/ipfs/QmcTcsTvfaeEBRFo1TkFgT8sRmgi1n1LTZpecfVP8fzpGD/go-cid"
|
|
)
|
|
|
|
var DagCmd = &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "Interact with ipld dag objects.",
|
|
ShortDescription: `
|
|
'ipfs dag' is used for creating and manipulating dag objects.
|
|
|
|
This subcommand is currently an experimental feature, but it is intended
|
|
to deprecate and replace the existing 'ipfs object' command moving forward.
|
|
`,
|
|
},
|
|
Subcommands: map[string]*cmds.Command{
|
|
"put": DagPutCmd,
|
|
"get": DagGetCmd,
|
|
},
|
|
}
|
|
|
|
type OutputObject struct {
|
|
Cid *cid.Cid
|
|
}
|
|
|
|
var DagPutCmd = &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "Add a dag node to ipfs.",
|
|
ShortDescription: `
|
|
'ipfs dag put' accepts input from a file or stdin and parses it
|
|
into an object of the specified format.
|
|
`,
|
|
},
|
|
Arguments: []cmds.Argument{
|
|
cmds.FileArg("object data", true, false, "The object to put").EnableStdin(),
|
|
},
|
|
Options: []cmds.Option{
|
|
cmds.StringOption("format", "f", "Format that the object will be added as.").Default("cbor"),
|
|
cmds.StringOption("input-enc", "Format that the input object will be.").Default("json"),
|
|
},
|
|
Run: func(req cmds.Request, res cmds.Response) {
|
|
n, err := req.InvocContext().GetNode()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
fi, err := req.Files().NextFile()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
ienc, _, _ := req.Option("input-enc").String()
|
|
format, _, _ := req.Option("format").String()
|
|
|
|
switch ienc {
|
|
case "json":
|
|
nd, err := convertJsonToType(fi, format)
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
c, err := n.DAG.Add(nd)
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
res.SetOutput(&OutputObject{Cid: c})
|
|
return
|
|
default:
|
|
res.SetError(fmt.Errorf("unrecognized input encoding: %s", ienc), cmds.ErrNormal)
|
|
return
|
|
}
|
|
},
|
|
Type: OutputObject{},
|
|
Marshalers: cmds.MarshalerMap{
|
|
cmds.Text: func(res cmds.Response) (io.Reader, error) {
|
|
oobj, ok := res.Output().(*OutputObject)
|
|
if !ok {
|
|
return nil, fmt.Errorf("expected a different object in marshaler")
|
|
}
|
|
|
|
return strings.NewReader(oobj.Cid.String()), nil
|
|
},
|
|
},
|
|
}
|
|
|
|
var DagGetCmd = &cmds.Command{
|
|
Helptext: cmds.HelpText{
|
|
Tagline: "Get a dag node from ipfs.",
|
|
ShortDescription: `
|
|
'ipfs dag get' fetches a dag node from ipfs and prints it out in the specifed format.
|
|
`,
|
|
},
|
|
Arguments: []cmds.Argument{
|
|
cmds.StringArg("cid", true, false, "The cid of the object to get").EnableStdin(),
|
|
},
|
|
Run: func(req cmds.Request, res cmds.Response) {
|
|
n, err := req.InvocContext().GetNode()
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
c, err := cid.Decode(req.Arguments()[0])
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
obj, err := n.DAG.Get(req.Context(), c)
|
|
if err != nil {
|
|
res.SetError(err, cmds.ErrNormal)
|
|
return
|
|
}
|
|
|
|
res.SetOutput(obj)
|
|
},
|
|
}
|
|
|
|
func convertJsonToType(r io.Reader, format string) (node.Node, error) {
|
|
switch format {
|
|
case "cbor", "dag-cbor":
|
|
return ipldcbor.FromJson(r)
|
|
case "dag-pb", "protobuf":
|
|
return nil, fmt.Errorf("protobuf handling in 'dag' command not yet implemented")
|
|
default:
|
|
return nil, fmt.Errorf("unknown target format: %s", format)
|
|
}
|
|
}
|