// Unmarshal unmarshals a macaroon in the format produced
// by Marshal. It also accepts base64-encoded JSON format.
func Unmarshal(s string) (*Macaroon, error) {
	var err C.enum_macaroon_returncode
	data := cStr(s)
	m := C.macaroon_deserialize(data, &err)
	if m == nil { // TODO: err gets set to INVALID even if this returns successful, fix that
		return nil, macaroonError(err)
	}
	return &Macaroon{m}, nil
}
// UnmarshalBinary unmarshals the macaroon from binary
// format.
func (m *Macaroon) UnmarshalBinary(data []byte) error {
	// libmacaroons expects the serialization in base64 encoding already,
	// but we just have the binary, so encode it for libmacaroons.
	b64data := make([]byte, base64.URLEncoding.EncodedLen(len(data)))
	base64.URLEncoding.Encode(b64data, data)
	var err C.enum_macaroon_returncode
	cm := C.macaroon_deserialize(cbuf(b64data), &err)
	if cm == nil {
		return macaroonError(err)
	}
	m.m = cm
	return nil
}