ics - decoder.go
1 // Package ics implements an encoder and decoder for iCalendar files
2 package ics // import "vimagination.zapto.org/ics"
3
4 import (
5 "io"
6 "strings"
7 )
8
9 type section interface {
10 decode(tokeniser) error
11 encode(w writer)
12 valid() error
13 }
14
15 // Decode decodes an iCalendar object from the given reader
16 func Decode(r io.Reader) (*Calendar, error) {
17 t := newTokeniser(&unfolder{r: r})
18 if p, err := t.GetPhrase(); err != nil {
19 return nil, err
20 } else if p.Type != phraseContentLine {
21 if t.Err == io.EOF {
22 return nil, io.ErrUnexpectedEOF
23 }
24 return nil, t.Err
25 } else if strings.ToUpper(p.Data[0].Data) != "BEGIN" || strings.ToUpper(p.Data[len(p.Data)-1].Data) != "VCALENDAR" {
26 return nil, ErrInvalidCalendar
27 }
28 cal := new(Calendar)
29 if err := cal.decode(t); err != nil {
30 return nil, err
31 }
32 return cal, nil
33 }