key_ops.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package jwk
  2. import "github.com/pkg/errors"
  3. func (ops *KeyOperationList) Get() KeyOperationList {
  4. if ops == nil {
  5. return nil
  6. }
  7. return *ops
  8. }
  9. func (ops *KeyOperationList) Accept(v interface{}) error {
  10. switch x := v.(type) {
  11. case string:
  12. return ops.Accept([]string{x})
  13. case []interface{}:
  14. l := make([]string, len(x))
  15. for i, e := range x {
  16. if es, ok := e.(string); ok {
  17. l[i] = es
  18. } else {
  19. return errors.Errorf(`invalid list element type: expected string, got %T`, v)
  20. }
  21. }
  22. return ops.Accept(l)
  23. case []string:
  24. list := make(KeyOperationList, len(x))
  25. for i, e := range x {
  26. switch e := KeyOperation(e); e {
  27. case KeyOpSign, KeyOpVerify, KeyOpEncrypt, KeyOpDecrypt, KeyOpWrapKey, KeyOpUnwrapKey, KeyOpDeriveKey, KeyOpDeriveBits:
  28. list[i] = e
  29. default:
  30. return errors.Errorf(`invalid keyoperation %v`, e)
  31. }
  32. }
  33. *ops = list
  34. return nil
  35. case []KeyOperation:
  36. list := make(KeyOperationList, len(x))
  37. for i, e := range x {
  38. switch e {
  39. case KeyOpSign, KeyOpVerify, KeyOpEncrypt, KeyOpDecrypt, KeyOpWrapKey, KeyOpUnwrapKey, KeyOpDeriveKey, KeyOpDeriveBits:
  40. list[i] = e
  41. default:
  42. return errors.Errorf(`invalid keyoperation %v`, e)
  43. }
  44. }
  45. *ops = list
  46. return nil
  47. case KeyOperationList:
  48. *ops = x
  49. return nil
  50. default:
  51. return errors.Errorf(`invalid value %T`, v)
  52. }
  53. }