// package vmask -- набор масок для защиты "снизу" package vmask import ( "encoding/json" ) // AMask -- маска значения-объекта. type AMask byte // Mask -- маска для защиты "снизу". type Mask struct { Val AMask // `json:"mask"` Набор признаков. } // VMask -- обёртка маски для защиты "снизу". type VMask struct { val Mask // Набор признаков. } const ( CanMut = AMask(0) // Признак мутабельности значения CanDefault = AMask(1) // Признак значения по умолчанию IsAuto = AMask(2) // Признак авто-инициализации ) // NewVMask -- создать маску для защиты "снизу". func NewVMask(mask AMask) VMask { sf := VMask{ val: Mask{ Val: mask, }, } return sf } // IsAuto -- возвращает признак авто-инициализации. func (sf *VMask) IsAuto() bool { return sf.val.Val&IsAuto != 0 } // CanDefault -- возвращает признак значения по умолчанию. func (sf *VMask) CanDefault() bool { return sf.val.Val&CanDefault != 0 } // CanMut -- возвращает признак мутабельности. func (sf *VMask) CanMut() bool { return sf.val.Val&CanMut != 0 } // Get -- возвращает маску значения. func (sf *VMask) Get() AMask { return sf.val.Val } // MarshalJSON -- реализация интерфейса Marshaler. func (sf *VMask) MarshalJSON() ([]byte, error) { // Возвращаем кастомную строку JSON return json.Marshal(sf.val) } // UnmarshalJSON -- реализация интерфейса Unmarshaler. func (sf *VMask) UnmarshalJSON(binData []byte) error { var mask Mask if err := json.Unmarshal(binData, &mask); err != nil { return err } sf.val = mask return nil } // String -- строковое представление маски. func (sf *VMask) String() string { out := "" if sf.CanMut() { out += "CanMut" } if sf.CanDefault() { if len(out) > 0 { out += "|" } out += "CanDefault" } if sf.IsAuto() { if len(out) > 0 { out += "|" } out += "IsAuto" } return "[" + out + "]" }