vmask.go 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. // package vmask -- набор масок для защиты "снизу"
  2. package vmask
  3. import (
  4. "encoding/json"
  5. )
  6. // AMask -- маска значения-объекта.
  7. type AMask byte
  8. // Mask -- маска для защиты "снизу".
  9. type Mask struct {
  10. Val AMask // `json:"mask"` Набор признаков.
  11. }
  12. // VMask -- обёртка маски для защиты "снизу".
  13. type VMask struct {
  14. val Mask // Набор признаков.
  15. }
  16. const (
  17. CanMut = AMask(0) // Признак мутабельности значения
  18. CanDefault = AMask(1) // Признак значения по умолчанию
  19. IsAuto = AMask(2) // Признак авто-инициализации
  20. )
  21. // NewVMask -- создать маску для защиты "снизу".
  22. func NewVMask(mask AMask) VMask {
  23. sf := VMask{
  24. val: Mask{
  25. Val: mask,
  26. },
  27. }
  28. return sf
  29. }
  30. // IsAuto -- возвращает признак авто-инициализации.
  31. func (sf *VMask) IsAuto() bool {
  32. return sf.val.Val&IsAuto != 0
  33. }
  34. // CanDefault -- возвращает признак значения по умолчанию.
  35. func (sf *VMask) CanDefault() bool {
  36. return sf.val.Val&CanDefault != 0
  37. }
  38. // CanMut -- возвращает признак мутабельности.
  39. func (sf *VMask) CanMut() bool {
  40. return sf.val.Val&CanMut != 0
  41. }
  42. // Get -- возвращает маску значения.
  43. func (sf *VMask) Get() AMask {
  44. return sf.val.Val
  45. }
  46. // MarshalJSON -- реализация интерфейса Marshaler.
  47. func (sf *VMask) MarshalJSON() ([]byte, error) {
  48. // Возвращаем кастомную строку JSON
  49. return json.Marshal(sf.val)
  50. }
  51. // UnmarshalJSON -- реализация интерфейса Unmarshaler.
  52. func (sf *VMask) UnmarshalJSON(binData []byte) error {
  53. var mask Mask
  54. if err := json.Unmarshal(binData, &mask); err != nil {
  55. return err
  56. }
  57. sf.val = mask
  58. return nil
  59. }
  60. // String -- строковое представление маски.
  61. func (sf *VMask) String() string {
  62. out := ""
  63. if sf.CanMut() {
  64. out += "CanMut"
  65. }
  66. if sf.CanDefault() {
  67. if len(out) > 0 {
  68. out += "|"
  69. }
  70. out += "CanDefault"
  71. }
  72. if sf.IsAuto() {
  73. if len(out) > 0 {
  74. out += "|"
  75. }
  76. out += "IsAuto"
  77. }
  78. return "[" + out + "]"
  79. }