github.com/aws-cloudformation/cloudformation-cli-go-plugin@v1.2.0/examples/github-repo/cmd/main.go (about) 1 // Code generated by 'cfn generate', changes will be undone by the next invocation. DO NOT EDIT. 2 package main 3 4 import ( 5 "errors" 6 "fmt" 7 "log" 8 9 "github.com/aws-cloudformation/cloudformation-cli-go-plugin/cfn" 10 "github.com/aws-cloudformation/cloudformation-cli-go-plugin/cfn/handler" 11 "github.com/aws-cloudformation/cloudformation-cli-go-plugin/examples/github-repo/cmd/resource" 12 ) 13 14 // Handler is a container for the CRUDL actions exported by resources 15 type Handler struct{} 16 17 // Create wraps the related Create function exposed by the resource code 18 func (r *Handler) Create(req handler.Request) handler.ProgressEvent { 19 return wrap(req, resource.Create) 20 } 21 22 // Read wraps the related Read function exposed by the resource code 23 func (r *Handler) Read(req handler.Request) handler.ProgressEvent { 24 return wrap(req, resource.Read) 25 } 26 27 // Update wraps the related Update function exposed by the resource code 28 func (r *Handler) Update(req handler.Request) handler.ProgressEvent { 29 return wrap(req, resource.Update) 30 } 31 32 // Delete wraps the related Delete function exposed by the resource code 33 func (r *Handler) Delete(req handler.Request) handler.ProgressEvent { 34 return wrap(req, resource.Delete) 35 } 36 37 // List wraps the related List function exposed by the resource code 38 func (r *Handler) List(req handler.Request) handler.ProgressEvent { 39 return wrap(req, resource.List) 40 } 41 42 // main is the entry point of the application. 43 func main() { 44 cfn.Start(&Handler{}) 45 } 46 47 type handlerFunc func(handler.Request, *resource.Model, *resource.Model) (handler.ProgressEvent, error) 48 49 func wrap(req handler.Request, f handlerFunc) (response handler.ProgressEvent) { 50 defer func() { 51 // Catch any panics and return a failed ProgressEvent 52 if r := recover(); r != nil { 53 err, ok := r.(error) 54 if !ok { 55 err = errors.New(fmt.Sprint(r)) 56 } 57 58 log.Printf("Trapped error in handler: %v", err) 59 60 response = handler.NewFailedEvent(err) 61 } 62 }() 63 64 // Populate the previous model 65 prevModel := &resource.Model{} 66 if err := req.UnmarshalPrevious(prevModel); err != nil { 67 log.Printf("Error unmarshaling prev model: %v", err) 68 return handler.NewFailedEvent(err) 69 } 70 71 // Populate the current model 72 currentModel := &resource.Model{} 73 if err := req.Unmarshal(currentModel); err != nil { 74 log.Printf("Error unmarshaling model: %v", err) 75 return handler.NewFailedEvent(err) 76 } 77 78 response, err := f(req, prevModel, currentModel) 79 if err != nil { 80 log.Printf("Error returned from handler function: %v", err) 81 return handler.NewFailedEvent(err) 82 } 83 84 return response 85 }