github.com/dahs81/otto@v0.2.1-0.20160126165905-6400716cf085/rpc/app.go (about) 1 package rpc 2 3 import ( 4 "net/rpc" 5 6 "github.com/hashicorp/otto/app" 7 "github.com/hashicorp/otto/appfile" 8 ) 9 10 // App is an implementation of app.App that communicates over RPC. 11 type App struct { 12 Broker *muxBroker 13 Client *rpc.Client 14 Name string 15 } 16 17 func (c *App) Meta() (*app.Meta, error) { 18 var resp AppMetaResponse 19 20 err := c.Client.Call(c.Name+".Meta", new(struct{}), &resp) 21 if err != nil { 22 return nil, err 23 } 24 if resp.Error != nil { 25 err = resp.Error 26 return nil, err 27 } 28 29 return resp.Result, nil 30 } 31 32 func (c *App) Implicit(ctx *app.Context) (*appfile.File, error) { 33 var resp AppImplicitResponse 34 args := AppContextArgs{Context: ctx} 35 36 // Serve the shared context data 37 serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs) 38 39 // Call 40 err := c.Client.Call(c.Name+".Implicit", &args, &resp) 41 if err != nil { 42 return nil, err 43 } 44 if resp.Error != nil { 45 err = resp.Error 46 return nil, err 47 } 48 49 return resp.Result, nil 50 } 51 52 func (c *App) Compile(ctx *app.Context) (*app.CompileResult, error) { 53 var resp AppCompileResponse 54 args := AppContextArgs{Context: ctx} 55 56 // Serve the shared context data 57 serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs) 58 59 // Call 60 err := c.Client.Call(c.Name+".Compile", &args, &resp) 61 if err != nil { 62 return nil, err 63 } 64 if resp.Error != nil { 65 err = resp.Error 66 return nil, err 67 } 68 69 return resp.Result, nil 70 } 71 72 func (c *App) Build(ctx *app.Context) error { 73 var resp AppSimpleResponse 74 args := AppContextArgs{Context: ctx} 75 76 // Serve the shared context data 77 serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs) 78 79 // Call 80 err := c.Client.Call(c.Name+".Build", &args, &resp) 81 if err == nil { 82 if resp.Error != nil { 83 err = resp.Error 84 } 85 } 86 87 return err 88 } 89 90 func (c *App) Deploy(ctx *app.Context) error { 91 var resp AppSimpleResponse 92 args := AppContextArgs{Context: ctx} 93 94 // Serve the shared context data 95 serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs) 96 97 // Call 98 err := c.Client.Call(c.Name+".Deploy", &args, &resp) 99 if err == nil { 100 if resp.Error != nil { 101 err = resp.Error 102 } 103 } 104 105 return err 106 } 107 108 func (c *App) Dev(ctx *app.Context) error { 109 var resp AppSimpleResponse 110 args := AppContextArgs{Context: ctx} 111 112 // Serve the shared context data 113 serveContext(c.Broker, &ctx.Shared, &args.ContextSharedArgs) 114 115 // Call 116 err := c.Client.Call(c.Name+".Dev", &args, &resp) 117 if err == nil { 118 if resp.Error != nil { 119 err = resp.Error 120 } 121 } 122 123 return err 124 } 125 126 func (c *App) DevDep(dst, src *app.Context) (*app.DevDep, error) { 127 var resp AppDevDepResponse 128 args := AppDevDepArgs{ 129 ContextDst: dst, 130 ContextSrc: src, 131 } 132 133 // Serve the shared context data 134 serveContext(c.Broker, &dst.Shared, &args.ContextDstShared) 135 serveContext(c.Broker, &src.Shared, &args.ContextSrcShared) 136 137 // Call 138 err := c.Client.Call(c.Name+".DevDep", &args, &resp) 139 if err == nil && resp.Error != nil { 140 err = resp.Error 141 } 142 if err != nil { 143 return nil, err 144 } 145 146 return resp.Result, nil 147 } 148 149 func (c *App) Close() error { 150 return c.Client.Close() 151 } 152 153 // AppServer is a net/rpc compatible structure for serving an App. 154 // This should not be used directly. 155 type AppServer struct { 156 Broker *muxBroker 157 App app.App 158 } 159 160 type AppContextArgs struct { 161 ContextSharedArgs 162 163 Context *app.Context 164 } 165 166 type AppMetaResponse struct { 167 Result *app.Meta 168 Error *BasicError 169 } 170 171 type AppCompileResponse struct { 172 Result *app.CompileResult 173 Error *BasicError 174 } 175 176 type AppImplicitResponse struct { 177 Result *appfile.File 178 Error *BasicError 179 } 180 181 type AppDevDepArgs struct { 182 ContextDst *app.Context 183 ContextDstShared ContextSharedArgs 184 ContextSrc *app.Context 185 ContextSrcShared ContextSharedArgs 186 } 187 188 type AppDevDepResponse struct { 189 Result *app.DevDep 190 Error *BasicError 191 } 192 193 type AppSimpleResponse struct { 194 Error *BasicError 195 } 196 197 func (s *AppServer) Meta( 198 args *struct{}, 199 reply *AppMetaResponse) error { 200 result, err := s.App.Meta() 201 *reply = AppMetaResponse{ 202 Result: result, 203 Error: NewBasicError(err), 204 } 205 206 return nil 207 } 208 209 func (s *AppServer) Implicit( 210 args *AppContextArgs, 211 reply *AppImplicitResponse) error { 212 closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs) 213 defer closer.Close() 214 if err != nil { 215 *reply = AppImplicitResponse{ 216 Error: NewBasicError(err), 217 } 218 219 return nil 220 } 221 222 result, err := s.App.Implicit(args.Context) 223 *reply = AppImplicitResponse{ 224 Result: result, 225 Error: NewBasicError(err), 226 } 227 228 return nil 229 } 230 231 func (s *AppServer) Compile( 232 args *AppContextArgs, 233 reply *AppCompileResponse) error { 234 closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs) 235 defer closer.Close() 236 if err != nil { 237 *reply = AppCompileResponse{ 238 Error: NewBasicError(err), 239 } 240 241 return nil 242 } 243 244 result, err := s.App.Compile(args.Context) 245 *reply = AppCompileResponse{ 246 Result: result, 247 Error: NewBasicError(err), 248 } 249 250 return nil 251 } 252 253 func (s *AppServer) Build( 254 args *AppContextArgs, 255 reply *AppSimpleResponse) error { 256 closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs) 257 defer closer.Close() 258 if err != nil { 259 *reply = AppSimpleResponse{ 260 Error: NewBasicError(err), 261 } 262 263 return nil 264 } 265 266 *reply = AppSimpleResponse{ 267 Error: NewBasicError(s.App.Build(args.Context)), 268 } 269 270 return nil 271 } 272 273 func (s *AppServer) Deploy( 274 args *AppContextArgs, 275 reply *AppSimpleResponse) error { 276 closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs) 277 defer closer.Close() 278 if err != nil { 279 *reply = AppSimpleResponse{ 280 Error: NewBasicError(err), 281 } 282 283 return nil 284 } 285 286 *reply = AppSimpleResponse{ 287 Error: NewBasicError(s.App.Deploy(args.Context)), 288 } 289 290 return nil 291 } 292 293 func (s *AppServer) Dev( 294 args *AppContextArgs, 295 reply *AppSimpleResponse) error { 296 closer, err := connectContext(s.Broker, &args.Context.Shared, &args.ContextSharedArgs) 297 defer closer.Close() 298 if err != nil { 299 *reply = AppSimpleResponse{ 300 Error: NewBasicError(err), 301 } 302 303 return nil 304 } 305 306 *reply = AppSimpleResponse{ 307 Error: NewBasicError(s.App.Dev(args.Context)), 308 } 309 310 return nil 311 } 312 313 func (s *AppServer) DevDep( 314 args *AppDevDepArgs, 315 reply *AppDevDepResponse) error { 316 // Dst 317 closer, err := connectContext(s.Broker, &args.ContextDst.Shared, &args.ContextDstShared) 318 defer closer.Close() 319 if err != nil { 320 *reply = AppDevDepResponse{ 321 Error: NewBasicError(err), 322 } 323 324 return nil 325 } 326 327 // Src 328 closer, err = connectContext(s.Broker, &args.ContextSrc.Shared, &args.ContextSrcShared) 329 defer closer.Close() 330 if err != nil { 331 *reply = AppDevDepResponse{ 332 Error: NewBasicError(err), 333 } 334 335 return nil 336 } 337 338 result, err := s.App.DevDep(args.ContextDst, args.ContextSrc) 339 *reply = AppDevDepResponse{ 340 Result: result, 341 Error: NewBasicError(err), 342 } 343 344 return nil 345 }