github.com/Files-com/files-sdk-go/v2@v2.1.2/requestresponseoption.go (about)

     1  package files_sdk
     2  
     3  import (
     4  	"context"
     5  	"io"
     6  	"net/http"
     7  )
     8  
     9  type requestResponseOption struct {
    10  	*http.Request
    11  	*http.Response
    12  	context.Context
    13  }
    14  
    15  type RequestResponseOption func(*requestResponseOption) error
    16  
    17  func RequestOption(call func(req *http.Request) error) RequestResponseOption {
    18  	return func(opt *requestResponseOption) error {
    19  		if opt.Request != nil {
    20  			return call(opt.Request)
    21  		}
    22  		return nil
    23  	}
    24  }
    25  
    26  func ResponseOption(call func(req *http.Response) error) RequestResponseOption {
    27  	return func(opt *requestResponseOption) error {
    28  		if opt.Response != nil {
    29  			return call(opt.Response)
    30  		}
    31  		return nil
    32  	}
    33  }
    34  
    35  func RequestHeadersOption(headers *http.Header) RequestResponseOption {
    36  	return RequestOption(func(req *http.Request) error {
    37  		for k, v := range *headers {
    38  			req.Header.Set(k, v[0])
    39  		}
    40  		return nil
    41  	})
    42  }
    43  
    44  func WithContext(ctx context.Context) RequestResponseOption {
    45  	return func(opt *requestResponseOption) error {
    46  		if opt.Request != nil && ctx != nil {
    47  			opt.Request.WithContext(ctx)
    48  		} else {
    49  			opt.Context = ctx
    50  		}
    51  		return nil
    52  	}
    53  }
    54  
    55  func ResponseBodyOption(opt func(io.ReadCloser) error) RequestResponseOption {
    56  	return ResponseOption(func(res *http.Response) error {
    57  		return opt(res.Body)
    58  	})
    59  }
    60  
    61  func WrapRequestOptions(client HttpClient, request *http.Request, opts ...RequestResponseOption) (*http.Response, error) {
    62  	for _, opt := range opts {
    63  		err := opt(&requestResponseOption{Request: request})
    64  		if err != nil {
    65  			return &http.Response{}, err
    66  		}
    67  	}
    68  
    69  	resp, err := client.Do(request)
    70  	if err != nil {
    71  		return resp, err
    72  	}
    73  
    74  	for _, opt := range opts {
    75  		err := opt(&requestResponseOption{Response: resp})
    76  		if err != nil {
    77  			return resp, err
    78  		}
    79  	}
    80  
    81  	return resp, nil
    82  }
    83  
    84  func ContextOption(opts []RequestResponseOption) context.Context {
    85  	params := &requestResponseOption{}
    86  	for _, opt := range opts {
    87  		opt(params)
    88  	}
    89  	if params.Context == nil {
    90  		params.Context = context.Background()
    91  	}
    92  	return params.Context
    93  }