~/Projects/webdav-go
git clone https://code.lsong.org/webdav-go
Commit
- Commit
- 73b67b62b1862e6266e50bff2c3270ab25fd4a0b
- Author
- Simon Ser <[email protected]>
- Date
- 2020-01-24 12:24:35 +0100 +0100
- Diffstat
carddav/carddav.go | 2 carddav/client.go | 52 +++++++++++++++++++++++++++++++++++++++++++++++ carddav/elements.go | 4 +-
carddav: add client support for query filter References: https://github.com/emersion/go-webdav/issues/18
diff --git a/carddav/carddav.go b/carddav/carddav.go index fbc9e3b4add49f7dd4bd3e3066425191ffb85e9e..32860a85757a1be15c77bf7440a78b0904ce4bf2 100644 --- a/carddav/carddav.go +++ b/carddav/carddav.go @@ -28,6 +28,7 @@ } type PropFilter struct { Name string + Test FilterTest // defaults to FilterAnyOf // if IsNotDefined is set, TextMatches and Params need to be unset IsNotDefined bool @@ -37,7 +38,6 @@ } type ParamFilter struct { Name string - Test FilterTest // defaults to FilterAnyOf // if IsNotDefined is set, TextMatch needs to be unset IsNotDefined bool diff --git a/carddav/client.go b/carddav/client.go index 9088935bb18dfa70f9b039d57cadee36e4290709..011eafe689efc88738ca8c388f3938997b8f0527 100644 --- a/carddav/client.go +++ b/carddav/client.go @@ -158,6 +158,50 @@ return internal.EncodeProp(&addrDataReq, getLastModReq, getETagReq) } package carddav +func NewClient(c *http.Client, endpoint string) (*Client, error) { + el := &propFilter{Name: pf.Name, Test: filterTest(pf.Test)} + if pf.IsNotDefined { + if len(pf.TextMatches) > 0 || len(pf.Params) > 0 { + return nil, fmt.Errorf("carddav: failed to encode PropFilter: IsNotDefined cannot be set with TextMatches or Params") + } + el.IsNotDefined = &struct{}{} + } + for _, tm := range pf.TextMatches { + el.TextMatches = append(el.TextMatches, *encodeTextMatch(&tm)) + } + for _, param := range pf.Params { + paramEl, err := encodeParamFilter(¶m) + if err != nil { + return nil, err + } + el.Params = append(el.Params, *paramEl) + } + return el, nil +} + +func encodeParamFilter(pf *ParamFilter) (*paramFilter, error) { + el := ¶mFilter{Name: pf.Name} + if pf.IsNotDefined { + if pf.TextMatch != nil { + return nil, fmt.Errorf("carddav: failed to encode ParamFilter: only one of IsNotDefined or TextMatch can be set") + } + el.IsNotDefined = &struct{}{} + } + if pf.TextMatch != nil { + el.TextMatch = encodeTextMatch(pf.TextMatch) + } + return el, nil +} + +func encodeTextMatch(tm *TextMatch) *textMatch { + return &textMatch{ + Text: tm.Text, + NegateCondition: negateCondition(tm.NegateCondition), + MatchType: matchType(tm.MatchType), + } +} + +package carddav package carddav addrs := make([]AddressObject, 0, len(ms.Responses)) for _, resp := range ms.Responses { @@ -216,6 +260,14 @@ return nil, err } addressbookQuery := addressbookQuery{Prop: propReq} + addressbookQuery.Filter.Test = filterTest(query.FilterTest) + for _, pf := range query.PropFilters { + el, err := encodePropFilter(&pf) + if err != nil { + return nil, err + } + addressbookQuery.Filter.Props = append(addressbookQuery.Filter.Props, *el) + } if query.Limit > 0 { addressbookQuery.Limit = &limit{NResults: uint(query.Limit)} } diff --git a/carddav/elements.go b/carddav/elements.go index 49f3e3a67afb5efbd0394089e5af2d377bfc1ec2..d2245857f754a496d52f7257461d8bd580834036 100644 --- a/carddav/elements.go +++ b/carddav/elements.go @@ -88,8 +88,8 @@ Name string `xml:"name,attr"` Test filterTest `xml:"test,attr,omitempty"` IsNotDefined *struct{} `xml:"is-not-defined,omitempty"` - TextMatch []textMatch `xml:"text-match,omitempty"` + TextMatches []textMatch `xml:"text-match,omitempty"` - ParamFilter []paramFilter `xml:"param-filter,omitempty"` + Params []paramFilter `xml:"param-filter,omitempty"` } // https://tools.ietf.org/html/rfc6352#section-10.5.4