mirror of
https://github.com/1f349/go-webdav.git
synced 2024-12-22 16:24:14 +00:00
internal: add Prop.Get, Prop.Decode
This commit is contained in:
parent
f3f1c8b58a
commit
b311299ac0
@ -107,6 +107,19 @@ func (resp *Response) Href() (string, error) {
|
|||||||
return resp.Hrefs[0], nil
|
return resp.Hrefs[0], nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type missingPropError struct {
|
||||||
|
XMLName xml.Name
|
||||||
|
}
|
||||||
|
|
||||||
|
func (err *missingPropError) Error() string {
|
||||||
|
return fmt.Sprintf("webdav: missing prop %q %q", err.XMLName.Space, err.XMLName.Local)
|
||||||
|
}
|
||||||
|
|
||||||
|
func IsMissingProp(err error) bool {
|
||||||
|
_, ok := err.(*missingPropError)
|
||||||
|
return ok
|
||||||
|
}
|
||||||
|
|
||||||
func (resp *Response) DecodeProp(v interface{}) error {
|
func (resp *Response) DecodeProp(v interface{}) error {
|
||||||
name, err := valueXMLName(v)
|
name, err := valueXMLName(v)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
@ -115,20 +128,17 @@ func (resp *Response) DecodeProp(v interface{}) error {
|
|||||||
if err := resp.Status.Err(); err != nil {
|
if err := resp.Status.Err(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
for i := range resp.Propstats {
|
for _, propstat := range resp.Propstats {
|
||||||
propstat := &resp.Propstats[i]
|
raw := propstat.Prop.Get(name)
|
||||||
for j := range propstat.Prop.Raw {
|
if raw == nil {
|
||||||
raw := &propstat.Prop.Raw[j]
|
continue
|
||||||
if n, ok := raw.XMLName(); ok && name == n {
|
|
||||||
if err := propstat.Status.Err(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
return raw.Decode(v)
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
if err := propstat.Status.Err(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
return raw.Decode(v)
|
||||||
}
|
}
|
||||||
|
return &missingPropError{name}
|
||||||
return fmt.Errorf("webdav: missing prop %v %v in response", name.Space, name.Local)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (resp *Response) EncodeProp(code int, v interface{}) error {
|
func (resp *Response) EncodeProp(code int, v interface{}) error {
|
||||||
@ -185,6 +195,30 @@ func EncodeProp(values ...interface{}) (*Prop, error) {
|
|||||||
return &Prop{Raw: l}, nil
|
return &Prop{Raw: l}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (p *Prop) Get(name xml.Name) *RawXMLValue {
|
||||||
|
for i := range p.Raw {
|
||||||
|
raw := &p.Raw[i]
|
||||||
|
if n, ok := raw.XMLName(); ok && name == n {
|
||||||
|
return raw
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (p *Prop) Decode(v interface{}) error {
|
||||||
|
name, err := valueXMLName(v)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
raw := p.Get(name)
|
||||||
|
if raw == nil {
|
||||||
|
return &missingPropError{name}
|
||||||
|
}
|
||||||
|
|
||||||
|
return raw.Decode(v)
|
||||||
|
}
|
||||||
|
|
||||||
// https://tools.ietf.org/html/rfc4918#section-14.20
|
// https://tools.ietf.org/html/rfc4918#section-14.20
|
||||||
type Propfind struct {
|
type Propfind struct {
|
||||||
XMLName xml.Name `xml:"DAV: propfind"`
|
XMLName xml.Name `xml:"DAV: propfind"`
|
||||||
|
Loading…
Reference in New Issue
Block a user