scim.go 887 B

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. package urn
  2. import (
  3. "encoding/json"
  4. "fmt"
  5. scimschema "github.com/leodido/go-urn/scim/schema"
  6. )
  7. const errInvalidSCIMURN = "invalid SCIM URN: %s"
  8. type SCIM struct {
  9. Type scimschema.Type
  10. Name string
  11. Other string
  12. pos int
  13. }
  14. func (s SCIM) MarshalJSON() ([]byte, error) {
  15. return json.Marshal(s.String())
  16. }
  17. func (s *SCIM) UnmarshalJSON(bytes []byte) error {
  18. var str string
  19. if err := json.Unmarshal(bytes, &str); err != nil {
  20. return err
  21. }
  22. // Parse as SCIM
  23. value, ok := Parse([]byte(str), WithParsingMode(RFC7643Only))
  24. if !ok {
  25. return fmt.Errorf(errInvalidSCIMURN, str)
  26. }
  27. if value.RFC() != RFC7643 {
  28. return fmt.Errorf(errInvalidSCIMURN, str)
  29. }
  30. *s = *value.SCIM()
  31. return nil
  32. }
  33. func (s *SCIM) String() string {
  34. ret := fmt.Sprintf("urn:ietf:params:scim:%s:%s", s.Type.String(), s.Name)
  35. if s.Other != "" {
  36. ret += fmt.Sprintf(":%s", s.Other)
  37. }
  38. return ret
  39. }