Liu Song’s Projects


~/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(&param)
+		if err != nil {
+			return nil, err
+		}
+		el.Params = append(el.Params, *paramEl)
+	}
+	return el, nil
+}
+
+func encodeParamFilter(pf *ParamFilter) (*paramFilter, error) {
+	el := &paramFilter{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