11package pigeon
22
33import (
4+ "encoding/base64"
45 "encoding/json"
56 "fmt"
7+ "io/ioutil"
8+ "net/http"
9+ "net/url"
610
711 "golang.org/x/net/context"
812 "golang.org/x/oauth2/google"
@@ -12,15 +16,35 @@ import (
1216)
1317
1418type (
15- // Client is
19+ // A Client provides cloud vision service.
1620 Client struct {
21+ // The context object to use when signing requests.
22+ // Defaults to `context.Background()`.
23+ // context context.Context
24+
25+ // The Config provides service configuration for service clients.
26+ config * Config
27+
28+ // The service object.
1729 service * vision.Service
1830 }
1931)
2032
2133// New returns a pointer to a new Client object.
22- func New (c * credentials.Credentials ) (* Client , error ) {
23- creds , err := c .Get ()
34+ func New (c * Config ) (* Client , error ) {
35+ if c == nil {
36+ // Sets a configuration if passed nil value.
37+ c = NewConfig ()
38+ }
39+
40+ // TODO: Running on GAE.
41+
42+ if c .Credentials == nil {
43+ // Sets application credentials by defaults.
44+ c .Credentials = credentials .NewApplicationCredentials ("" )
45+ }
46+
47+ creds , err := c .Credentials .Get ()
2448 if err != nil {
2549 return nil , err
2650 }
@@ -38,6 +62,7 @@ func New(c *credentials.Credentials) (*Client, error) {
3862 }
3963
4064 return & Client {
65+ config : c ,
4166 service : srv ,
4267 }, nil
4368}
@@ -46,3 +71,101 @@ func New(c *credentials.Credentials) (*Client, error) {
4671func (c Client ) ImagesService () * vision.ImagesService {
4772 return c .service .Images
4873}
74+
75+ // NewBatchAnnotateImageRequest returns a pointer to a new vision's BatchAnnotateImagesRequest.
76+ func (c Client ) NewBatchAnnotateImageRequest (list []string , features ... * vision.Feature ) (* vision.BatchAnnotateImagesRequest , error ) {
77+ batch := & vision.BatchAnnotateImagesRequest {}
78+ batch .Requests = []* vision.AnnotateImageRequest {}
79+ for _ , v := range list {
80+ req , err := c .NewAnnotateImageRequest (v , features ... )
81+ if err != nil {
82+ return nil , err
83+ }
84+ batch .Requests = append (batch .Requests , req )
85+ }
86+ return batch , nil
87+ }
88+
89+ // NewAnnotateImageRequest returns a pointer to a new vision's AnnotateImagesRequest.
90+ func (c Client ) NewAnnotateImageRequest (v interface {}, features ... * vision.Feature ) (* vision.AnnotateImageRequest , error ) {
91+ switch v .(type ) {
92+ case []byte :
93+ // base64
94+ return NewAnnotateImageContentRequest (v .([]byte ), features ... )
95+ case string :
96+ u , err := url .Parse (v .(string ))
97+ if err != nil {
98+ return nil , err
99+ }
100+ switch u .Scheme {
101+ case "gs" :
102+ // GcsImageUri: Google Cloud Storage image URI. It must be in the
103+ // following form:
104+ // "gs://bucket_name/object_name". For more
105+ return NewAnnotateImageSourceRequest (u .String (), features ... )
106+ case "http" , "https" :
107+ httpClient := c .config .HTTPClient
108+ if httpClient == nil {
109+ httpClient = http .DefaultClient
110+ }
111+ resp , err := httpClient .Get (u .String ())
112+ if err != nil {
113+ return nil , err
114+ }
115+ defer resp .Body .Close ()
116+ if resp .StatusCode >= http .StatusBadRequest {
117+ return nil , http .ErrMissingFile
118+ }
119+ body , err := ioutil .ReadAll (resp .Body )
120+ if err != nil {
121+ return nil , err
122+ }
123+ return c .NewAnnotateImageRequest (body , features ... )
124+ }
125+ // filepath
126+ b , err := ioutil .ReadFile (u .String ())
127+ if err != nil {
128+ return nil , err
129+ }
130+ return c .NewAnnotateImageRequest (b , features ... )
131+ }
132+ return & vision.AnnotateImageRequest {}, nil
133+ }
134+
135+ // NewAnnotateImageContentRequest returns a pointer to a new vision's AnnotateImagesRequest.
136+ func NewAnnotateImageContentRequest (body []byte , features ... * vision.Feature ) (* vision.AnnotateImageRequest , error ) {
137+ req := & vision.AnnotateImageRequest {
138+ Image : NewAnnotateImageContent (body ),
139+ Features : features ,
140+ }
141+ return req , nil
142+ }
143+
144+ // NewAnnotateImageSourceRequest returns a pointer to a new vision's AnnotateImagesRequest.
145+ func NewAnnotateImageSourceRequest (source string , features ... * vision.Feature ) (* vision.AnnotateImageRequest , error ) {
146+ req := & vision.AnnotateImageRequest {
147+ Image : NewAnnotateImageSource (source ),
148+ Features : features ,
149+ }
150+ return req , nil
151+ }
152+
153+ // NewAnnotateImageContent returns a pointer to a new vision's Image.
154+ // It's contained image content, represented as a stream of bytes.
155+ func NewAnnotateImageContent (body []byte ) * vision.Image {
156+ return & vision.Image {
157+ // Content: Image content, represented as a stream of bytes.
158+ Content : base64 .StdEncoding .EncodeToString (body ),
159+ }
160+ }
161+
162+ // NewAnnotateImageSource returns a pointer to a new vision's Image.
163+ // It's contained external image source (i.e. Google Cloud Storage image
164+ // location).
165+ func NewAnnotateImageSource (source string ) * vision.Image {
166+ return & vision.Image {
167+ Source : & vision.ImageSource {
168+ GcsImageUri : source ,
169+ },
170+ }
171+ }
0 commit comments