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  }