import gleam/dynamic/decode.{type Decoder} import gleam/json.{type Json} import gleam/string pub opaque type MarketSymbol { MarketSymbol(String) } pub const min_length: Int = 1 pub fn parse(value: String) -> Result(MarketSymbol, Nil) { case string.length(value) >= min_length { True -> Ok(MarketSymbol(value)) False -> Error(Nil) } } pub fn decoder() -> Decoder(MarketSymbol) { use value <- decode.then(decode.string) case parse(value) { Ok(market_symbol) -> decode.success(market_symbol) Error(Nil) -> decode.failure(MarketSymbol("invalid"), "MarketSymbol") } } pub fn to_string(market_symbol: MarketSymbol) -> String { let MarketSymbol(symbol) = market_symbol symbol } pub fn encode(market_symbol: MarketSymbol) -> Json { json.string(to_string(market_symbol)) }