Skip to content

Commit

Permalink
unhandled errors (#122)
Browse files Browse the repository at this point in the history
* unhandled errors

* update defer() error handling
  • Loading branch information
R-maan authored Jul 31, 2020
1 parent aaae071 commit 76e2dde
Show file tree
Hide file tree
Showing 8 changed files with 251 additions and 75 deletions.
38 changes: 28 additions & 10 deletions cmd/ion-go/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ func main() {
printHelp()

case "version", "--version", "-v":
printVersion()
err = printVersion()

case "process":
err = process(os.Args[2:])
Expand Down Expand Up @@ -71,26 +71,44 @@ func printHelp() {
}

// printVersion prints (in ion) the version info for this tool.
func printVersion() {
func printVersion() error {
w := ion.NewTextWriterOpts(os.Stdout, ion.TextWriterPretty)

w.BeginStruct()
if err := w.BeginStruct(); err != nil {
return err
}
{
w.FieldName("version")
w.WriteString(internal.GitCommit)
if err := w.FieldName("version"); err != nil {
return err
}
if err := w.WriteString(internal.GitCommit); err != nil {
return err
}

buildtime, err := ion.NewTimestampFromStr(internal.BuildTime, ion.TimestampPrecisionSecond, ion.TimezoneUTC)
if err == nil {
w.FieldName("build_time")
w.WriteTimestamp(buildtime)
if err := w.FieldName("build_time"); err != nil {
return err
}
if err := w.WriteTimestamp(buildtime); err != nil {
return err
}
} else {
w.FieldName("build_time")
w.WriteString("unknown-buildtime")
if err := w.FieldName("build_time"); err != nil {
return err
}
if err := w.WriteString("unknown-buildtime"); err != nil {
return err
}
}
}
w.EndStruct()
if err := w.EndStruct(); err != nil {
return err
}

if err := w.Finish(); err != nil {
panic(err)
}

return nil
}
44 changes: 35 additions & 9 deletions cmd/ion-go/process.go
Original file line number Diff line number Diff line change
Expand Up @@ -98,12 +98,19 @@ func newProcessor(args []string) (*processor, error) {
return ret, nil
}

func (p *processor) run() error {
func (p *processor) run() (deferredErr error) {
outf, err := OpenOutput(p.outf)
if err != nil {
return err
}
defer outf.Close()
defer func() {
closeError := outf.Close()
if err == nil {
deferredErr = closeError
} else {
deferredErr = err
}
}()

switch p.format {
case "", "pretty":
Expand All @@ -117,28 +124,44 @@ func (p *processor) run() error {
case "none":
p.out = NewNopWriter()
default:
return errors.New("unrecognized output format \"" + p.format + "\"")
err = errors.New("unrecognized output format \"" + p.format + "\"")
return err
}

errf, err := OpenError(p.errf)
if err != nil {
return err
}
defer errf.Close()
defer func() {
finishError := errf.Close()
if err == nil {
deferredErr = finishError
} else {
deferredErr = err
}
}()

p.err = NewErrorReport(errf)
defer p.err.Finish()
defer func() {
finishError := p.err.Finish()
if err == nil {
deferredErr = finishError
} else {
deferredErr = err
}
}()

if len(p.infs) == 0 {
p.processStdin()
return nil
}

if err := p.processFiles(); err != nil {
err = p.processFiles()
if err != nil {
return err
}

return nil
return err
}

func (p *processor) processStdin() {
Expand All @@ -165,12 +188,15 @@ func (p *processor) processFiles() error {
return nil
}

func (p *processor) processFile(in string) error {
func (p *processor) processFile(in string) (err error) {
f, err := OpenInput(in)
if err != nil {
return err
}
defer f.Close()

defer func() {
err = f.Close()
}()

p.loc = in
p.processReader(f)
Expand Down
4 changes: 2 additions & 2 deletions cmd/ion-go/util.go
Original file line number Diff line number Diff line change
Expand Up @@ -84,6 +84,6 @@ func (r *ErrorReport) Append(typ errortype, msg, loc string, idx int) {
}

// Finish finishes writing this report.
func (r *ErrorReport) Finish() {
r.w.Finish()
func (r *ErrorReport) Finish() error {
return r.w.Finish()
}
24 changes: 19 additions & 5 deletions ion/marshal.go
Original file line number Diff line number Diff line change
Expand Up @@ -224,15 +224,21 @@ func (m *Encoder) encodeMap(v reflect.Value, hint Type) error {
return m.w.WriteNull()
}

m.w.BeginStruct()
err := m.w.BeginStruct()
if err != nil {
return err
}

keys := keysFor(v)
if m.opts&EncodeSortMaps != 0 {
sort.Slice(keys, func(i, j int) bool { return keys[i].s < keys[j].s })
}

for _, key := range keys {
m.w.FieldName(key.s)
err = m.w.FieldName(key.s)
if err != nil {
return err
}
value := v.MapIndex(key.v)
if err := m.encodeValue(value, hint); err != nil {
return err
Expand Down Expand Up @@ -295,9 +301,15 @@ func (m *Encoder) encodeBlob(v reflect.Value, hint Type) error {
// EncodeArray encodes an array to the output writer as an Ion list (or sexp).
func (m *Encoder) encodeArray(v reflect.Value, hint Type) error {
if hint == SexpType {
m.w.BeginSexp()
err := m.w.BeginSexp()
if err != nil {
return err
}
} else {
m.w.BeginList()
err := m.w.BeginList()
if err != nil {
return err
}
}

for i := 0; i < v.Len(); i++ {
Expand Down Expand Up @@ -352,7 +364,9 @@ FieldLoop:
continue
}

m.w.FieldName(f.name)
if err := m.w.FieldName(f.name); err != nil {
return err
}
if err := m.encodeValue(fv, f.hint); err != nil {
return err
}
Expand Down
10 changes: 8 additions & 2 deletions ion/skipper.go
Original file line number Diff line number Diff line change
Expand Up @@ -60,7 +60,10 @@ func (t *tokenizer) SkipDot() (bool, error) {
return false, nil
}

t.read()
_, err = t.read()
if err != nil {
return false, err
}
return true, nil
}

Expand Down Expand Up @@ -869,7 +872,10 @@ func (t *tokenizer) skipDoubleColon() (bool, error) {
}

if cs[0] == ':' && cs[1] == ':' {
t.skipN(2)
err = t.skipN(2)
if err != nil {
return false, err
}
return true, nil
}

Expand Down
108 changes: 81 additions & 27 deletions ion/symboltable.go
Original file line number Diff line number Diff line change
Expand Up @@ -141,23 +141,43 @@ func (s *sst) FindByID(id uint64) (string, bool) {
}

func (s *sst) WriteTo(w Writer) error {
w.Annotation("$ion_shared_symbol_table")
w.BeginStruct()
if err := w.Annotation("$ion_shared_symbol_table"); err != nil {
return err
}
if err := w.BeginStruct(); err != nil {
return err
}
{
w.FieldName("name")
w.WriteString(s.name)
if err := w.FieldName("name"); err != nil {
return err
}
if err := w.WriteString(s.name); err != nil {
return err
}

w.FieldName("version")
w.WriteInt(int64(s.version))
if err := w.FieldName("version"); err != nil {
return err
}
if err := w.WriteInt(int64(s.version)); err != nil {
return err
}

w.FieldName("symbols")
w.BeginList()
if err := w.FieldName("symbols"); err != nil {
return err
}
if err := w.BeginList(); err != nil {
return err
}
{
for _, sym := range s.symbols {
w.WriteString(sym)
if err := w.WriteString(sym); err != nil {
return err
}
}
}
w.EndList()
if err := w.EndList(); err != nil {
return err
}
}
return w.EndStruct()
}
Expand Down Expand Up @@ -348,38 +368,72 @@ func (t *lst) WriteTo(w Writer) error {
return nil
}

w.Annotation("$ion_symbol_table")
w.BeginStruct()
if err := w.Annotation("$ion_symbol_table"); err != nil {
return err
}
if err := w.BeginStruct(); err != nil {
return err
}

if len(t.imports) > 1 {
w.FieldName("imports")
w.BeginList()
if err := w.FieldName("imports"); err != nil {
return err
}
if err := w.BeginList(); err != nil {
return err
}
for i := 1; i < len(t.imports); i++ {
imp := t.imports[i]
w.BeginStruct()
if err := w.BeginStruct(); err != nil {
return err
}

w.FieldName("name")
w.WriteString(imp.Name())
if err := w.FieldName("name"); err != nil {
return err
}
if err := w.WriteString(imp.Name()); err != nil {
return err
}

w.FieldName("version")
w.WriteInt(int64(imp.Version()))
if err := w.FieldName("version"); err != nil {
return err
}
if err := w.WriteInt(int64(imp.Version())); err != nil {
return err
}

w.FieldName("max_id")
w.WriteUint(imp.MaxID())
if err := w.FieldName("max_id"); err != nil {
return err
}
if err := w.WriteUint(imp.MaxID()); err != nil {
return err
}

w.EndStruct()
if err := w.EndStruct(); err != nil {
return err
}
}
if err := w.EndList(); err != nil {
return err
}
w.EndList()
}

if len(t.symbols) > 0 {
w.FieldName("symbols")
if err := w.FieldName("symbols"); err != nil {
return err
}

w.BeginList()
if err := w.BeginList(); err != nil {
return err
}
for _, sym := range t.symbols {
w.WriteString(sym)
if err := w.WriteString(sym); err != nil {
return err
}
}
if err := w.EndList(); err != nil {
return err
}
w.EndList()
}

return w.EndStruct()
Expand Down
5 changes: 4 additions & 1 deletion ion/textwriter.go
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,10 @@ func (w *textWriter) WriteBlob(val []byte) error {
}

enc := base64.NewEncoder(base64.StdEncoding, w.out)
enc.Write(val)
_, err := enc.Write(val)
if err != nil {
return err
}
if w.err = enc.Close(); w.err != nil {
return w.err
}
Expand Down
Loading

0 comments on commit 76e2dde

Please sign in to comment.