で定義 型つきで利用 → 確定 標準の T::Enum は名前の集合。Mangrove の Enum はバリアントごとに値を持てる { "type": "person", "data": { "name": "Alice", "age": 30 } } { "type": "book", "data": { "title": "1984", "author": "Orwell" } } case res["type"] when "book" res["data"]["title"] # => T.untyped end class MyApiResponse extend Mangrove::Enum variants do variant Person, Person variant Book, Book end end case res when MyApiResponse::Person res.age # => Integer when MyApiResponse::Book res.title # => String end
EngravingValidator extend T::Sig sig { params(p: Personalization).returns(Mangrove::Result[NilClass, EngravingError]) } def self.validate_personalization(p) if p.is_a?(Personalization::Engraving) return Result::Err.new(EngravingError::Empty) if p.inner.strip.empty? return Result::Err.new(EngravingError::TooLong) if p.inner.length > MAX_LENGTH return Result::Err.new(EngravingError::InvalidCharacters) unless p.inner.match?(PATTERN) end Result::Ok.new(nil) end end