code: func unmarshalBody(b []interface{}) (Body, error) {
  	buf := Body{}
  	for _, e := range b {
  		if m, ok := e.(map[string]interface{}); ok {
  			expr := &Expr{}
  			if err := unmarshalExpr(expr, m); err == nil {
  				buf = append(buf, expr)
  				continue
  			}
  		}
  		goto unmarshal_error
  	}
  	return buf, nil
  unmarshal_error:
  	return nil, fmt.Errorf("ast: unable to unmarshal body")
  }
docs: // NOTE(tsandall): The unmarshalling errors in these functions are not
  // helpful for callers because they do not identify the source of the
  // unmarshalling error. Because OPA doesn't accept JSON describing ASTs
  // from callers, this is acceptable (for now). If that changes in the future,
  // the error messages should be revisited. The current approach focuses
  // on the happy path and treats all errors the same. If better error
  // reporting is needed, the error paths will need to be fleshed out.