object.go 3.05 KB
Newer Older
1 2 3 4 5 6 7 8
package iface

import (
	"context"
	"io"

	options "github.com/ipfs/go-ipfs/core/coreapi/interface/options"

Steven Allen's avatar
Steven Allen committed
9 10
	cid "gx/ipfs/QmYVNvtQkeZ6AKSwDrjQTs432QtL6umrrK41EBq3cu7iSP/go-cid"
	ipld "gx/ipfs/QmZtNq8dArGfnpCZfx2pUNY7UcjGhVp5qqwQ4hH6mpTMRQ/go-ipld-format"
11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
)

// ObjectStat provides information about dag nodes
type ObjectStat struct {
	// Cid is the CID of the node
	Cid *cid.Cid

	// NumLinks is number of links the node contains
	NumLinks int

	// BlockSize is size of the raw serialized node
	BlockSize int

	// LinksSize is size of the links block section
	LinksSize int

	// DataSize is the size of data block section
	DataSize int

	// CumulativeSize is size of the tree (BlockSize + link sizes)
	CumulativeSize int
}

34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66

const (
	// DiffAdd is a Type of ObjectChange where a link was added to the graph
	DiffAdd = iota

	// DiffRemove is a Type of ObjectChange where a link was removed from the graph
	DiffRemove

	// DiffMod is a Type of ObjectChange where a link was changed in the graph
	DiffMod
)

// ObjectChange represents a change ia a graph
// TODO: do we want this to be an interface?
type ObjectChange struct {
	// Type of the change, either:
	// * DiffAdd - Added a link
	// * DiffRemove - Removed a link
	// * DiffMod - Modified a link
	Type int

	// Path to the changed link
	Path string

	// Before holds the link path before the change. Note that when a link is
	// added, this will be nil.
	Before Path

	// After holds the link path after the change. Note that when a link is
	// removed, this will be nil.
	After Path
}

67 68 69 70 71 72 73
// ObjectAPI specifies the interface to MerkleDAG and contains useful utilities
// for manipulating MerkleDAG data structures.
type ObjectAPI interface {
	// New creates new, empty (by default) dag-node.
	New(context.Context, ...options.ObjectNewOption) (ipld.Node, error)

	// Put imports the data into merkledag
74
	Put(context.Context, io.Reader, ...options.ObjectPutOption) (ResolvedPath, error)
75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90

	// Get returns the node for the path
	Get(context.Context, Path) (ipld.Node, error)

	// Data returns reader for data of the node
	Data(context.Context, Path) (io.Reader, error)

	// Links returns lint or links the node contains
	Links(context.Context, Path) ([]*ipld.Link, error)

	// Stat returns information about the node
	Stat(context.Context, Path) (*ObjectStat, error)

	// AddLink adds a link under the specified path. child path can point to a
	// subdirectory within the patent which must be present (can be overridden
	// with WithCreate option).
91
	AddLink(ctx context.Context, base Path, name string, child Path, opts ...options.ObjectAddLinkOption) (ResolvedPath, error)
92 93

	// RmLink removes a link from the node
94
	RmLink(ctx context.Context, base Path, link string) (ResolvedPath, error)
95 96

	// AppendData appends data to the node
97
	AppendData(context.Context, Path, io.Reader) (ResolvedPath, error)
98 99

	// SetData sets the data contained in the node
100
	SetData(context.Context, Path, io.Reader) (ResolvedPath, error)
101 102 103 104

	// Diff returns a set of changes needed to transform the first object into the
	// second.
	Diff(context.Context, Path, Path) ([]ObjectChange, error)
105
}