github.com/cozy/cozy-stack@v0.0.0-20240603063001-31110fa4cae1/pkg/couchdb/encoding.go (about)

     1  package couchdb
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/url"
     6  
     7  	"github.com/google/go-querystring/query"
     8  )
     9  
    10  func maybeSet(u url.Values, k string, v interface{}) error {
    11  	if v == nil || v == "" {
    12  		return nil
    13  	}
    14  
    15  	b, err := json.Marshal(v)
    16  	if err != nil {
    17  		return err
    18  	}
    19  
    20  	u.Set(k, string(b))
    21  	return nil
    22  }
    23  
    24  // Values transforms a ViewRequest into a query string suitable for couchdb
    25  // ie, where non-scalar fields have been JSON+URL encoded.
    26  func (vr *ViewRequest) Values() (url.Values, error) {
    27  	var v url.Values
    28  
    29  	v, err := query.Values(vr)
    30  	if err != nil {
    31  		return nil, err
    32  	}
    33  
    34  	if err := maybeSet(v, "key", vr.Key); err != nil {
    35  		return nil, err
    36  	}
    37  	if err := maybeSet(v, "start_key", vr.StartKey); err != nil {
    38  		return nil, err
    39  	}
    40  	if err := maybeSet(v, "end_key", vr.EndKey); err != nil {
    41  		return nil, err
    42  	}
    43  
    44  	return v, nil
    45  }
    46  
    47  // Values transforms a AllDocsRequest into a query string suitable for couchdb
    48  // ie, where non-scalar fields have been JSON+URL encoded.
    49  func (adr *AllDocsRequest) Values() (url.Values, error) {
    50  	var v url.Values
    51  
    52  	v, err := query.Values(adr)
    53  	if err != nil {
    54  		return nil, err
    55  	}
    56  
    57  	if len(adr.Keys) > 0 {
    58  		if err := maybeSet(v, "keys", adr.Keys); err != nil {
    59  			return nil, err
    60  		}
    61  	}
    62  	if err := maybeSet(v, "startkey", adr.StartKey); err != nil {
    63  		return nil, err
    64  	}
    65  	if err := maybeSet(v, "endkey", adr.EndKey); err != nil {
    66  		return nil, err
    67  	}
    68  
    69  	return v, nil
    70  }