OSDN Git Service

Merge pull request #41 from Bytom/dev
[bytom/vapor.git] / vendor / github.com / ipfs / go-ipfs-api / add.go
1 package shell
2
3 import (
4         "context"
5         "encoding/json"
6         "errors"
7         "io"
8         "os"
9         "path"
10
11         "github.com/ipfs/go-ipfs-files"
12 )
13
14 type object struct {
15         Hash string
16 }
17
18 type AddOpts = func(*RequestBuilder) error
19
20 func OnlyHash(enabled bool) AddOpts {
21         return func(rb *RequestBuilder) error {
22                 rb.Option("only-hash", enabled)
23                 return nil
24         }
25 }
26
27 func Pin(enabled bool) AddOpts {
28         return func(rb *RequestBuilder) error {
29                 rb.Option("pin", enabled)
30                 return nil
31         }
32 }
33
34 func Progress(enabled bool) AddOpts {
35         return func(rb *RequestBuilder) error {
36                 rb.Option("progress", enabled)
37                 return nil
38         }
39 }
40
41 func RawLeaves(enabled bool) AddOpts {
42         return func(rb *RequestBuilder) error {
43                 rb.Option("raw-leaves", enabled)
44                 return nil
45         }
46 }
47
48 func (s *Shell) Add(r io.Reader, options ...AddOpts) (string, error) {
49         fr := files.NewReaderFile(r)
50         slf := files.NewSliceDirectory([]files.DirEntry{files.FileEntry("", fr)})
51         fileReader := files.NewMultiFileReader(slf, true)
52
53         var out object
54         rb := s.Request("add")
55         for _, option := range options {
56                 option(rb)
57         }
58         return out.Hash, rb.Body(fileReader).Exec(context.Background(), &out)
59 }
60
61 // AddNoPin adds a file to ipfs without pinning it
62 // Deprecated: Use Add() with option functions instead
63 func (s *Shell) AddNoPin(r io.Reader) (string, error) {
64         return s.Add(r, Pin(false))
65 }
66
67 // AddWithOpts adds a file to ipfs with some additional options
68 // Deprecated: Use Add() with option functions instead
69 func (s *Shell) AddWithOpts(r io.Reader, pin bool, rawLeaves bool) (string, error) {
70         return s.Add(r, Pin(pin), RawLeaves(rawLeaves))
71 }
72
73 func (s *Shell) AddLink(target string) (string, error) {
74         link := files.NewLinkFile(target, nil)
75         slf := files.NewSliceDirectory([]files.DirEntry{files.FileEntry("", link)})
76         reader := files.NewMultiFileReader(slf, true)
77
78         var out object
79         return out.Hash, s.Request("add").Body(reader).Exec(context.Background(), &out)
80 }
81
82 // AddDir adds a directory recursively with all of the files under it
83 func (s *Shell) AddDir(dir string) (string, error) {
84         stat, err := os.Lstat(dir)
85         if err != nil {
86                 return "", err
87         }
88
89         sf, err := files.NewSerialFile(dir, false, stat)
90         if err != nil {
91                 return "", err
92         }
93         slf := files.NewSliceDirectory([]files.DirEntry{files.FileEntry(path.Base(dir), sf)})
94         reader := files.NewMultiFileReader(slf, true)
95
96         resp, err := s.Request("add").
97                 Option("recursive", true).
98                 Body(reader).
99                 Send(context.Background())
100         if err != nil {
101                 return "", nil
102         }
103
104         defer resp.Close()
105
106         if resp.Error != nil {
107                 return "", resp.Error
108         }
109
110         dec := json.NewDecoder(resp.Output)
111         var final string
112         for {
113                 var out object
114                 err = dec.Decode(&out)
115                 if err != nil {
116                         if err == io.EOF {
117                                 break
118                         }
119                         return "", err
120                 }
121                 final = out.Hash
122         }
123
124         if final == "" {
125                 return "", errors.New("no results received")
126         }
127
128         return final, nil
129 }