42 lines
1.2 KiB
Go
42 lines
1.2 KiB
Go
|
package pogs
|
||
|
|
||
|
import (
|
||
|
"encoding/json"
|
||
|
"fmt"
|
||
|
|
||
|
"github.com/pkg/errors"
|
||
|
)
|
||
|
|
||
|
// ScopeUnmarshaler can marshal a Scope pog from JSON.
|
||
|
type ScopeUnmarshaler struct {
|
||
|
Scope Scope
|
||
|
}
|
||
|
|
||
|
// UnmarshalJSON takes in a JSON string, and attempts to marshal it into a Scope.
|
||
|
// If successful, the Scope member of this ScopeUnmarshaler is set and nil is returned.
|
||
|
// If unsuccessful, returns an error.
|
||
|
func (su *ScopeUnmarshaler) UnmarshalJSON(b []byte) error {
|
||
|
var scopeJSON map[string]interface{}
|
||
|
if err := json.Unmarshal(b, &scopeJSON); err != nil {
|
||
|
return errors.Wrapf(err, "cannot unmarshal %s into scopeJSON", string(b))
|
||
|
}
|
||
|
|
||
|
if group, ok := scopeJSON["group"]; ok {
|
||
|
if val, ok := group.(string); ok {
|
||
|
su.Scope = NewGroup(val)
|
||
|
return nil
|
||
|
}
|
||
|
return fmt.Errorf("JSON should have been a Scope, but the 'group' key contained %v", group)
|
||
|
}
|
||
|
|
||
|
if systemName, ok := scopeJSON["system_name"]; ok {
|
||
|
if val, ok := systemName.(string); ok {
|
||
|
su.Scope = NewSystemName(val)
|
||
|
return nil
|
||
|
}
|
||
|
return fmt.Errorf("JSON should have been a Scope, but the 'system_name' key contained %v", systemName)
|
||
|
}
|
||
|
|
||
|
return fmt.Errorf("JSON should have been an object with one root key, either 'system_name' or 'group'")
|
||
|
}
|