package model import "strings" var supportedRails = map[Rail]struct{}{ RailCrypto: {}, RailProviderSettlement: {}, RailLedger: {}, RailCardPayout: {}, RailFiatOnRamp: {}, RailFiatOffRamp: {}, } // ParseRail canonicalizes string values into a Rail token. func ParseRail(value string) Rail { clean := strings.ToUpper(strings.TrimSpace(value)) if clean == "" { return RailUnspecified } clean = strings.ReplaceAll(clean, "-", "_") clean = strings.ReplaceAll(clean, " ", "_") for strings.Contains(clean, "__") { clean = strings.ReplaceAll(clean, "__", "_") } switch clean { case string(RailCrypto), "RAIL_CRYPTO": return RailCrypto case string(RailProviderSettlement), "PROVIDER_SETTLEMENT", "RAIL_SETTLEMENT", "RAIL_PROVIDER_SETTLEMENT": return RailProviderSettlement case string(RailLedger), "RAIL_LEDGER": return RailLedger case string(RailCardPayout), "CARD_PAYOUT", "RAIL_CARD", "RAIL_CARD_PAYOUT": return RailCardPayout case string(RailFiatOnRamp), "FIAT_ONRAMP", "RAIL_ONRAMP", "RAIL_FIAT_ONRAMP": return RailFiatOnRamp case string(RailFiatOffRamp), "FIAT_OFFRAMP", "RAIL_OFFRAMP", "RAIL_FIAT_OFFRAMP": return RailFiatOffRamp default: return RailUnspecified } } // IsSupportedRail reports whether rail is recognized by payment planning. func IsSupportedRail(rail Rail) bool { _, ok := supportedRails[ParseRail(string(rail))] return ok } func normalizeRail(value Rail) Rail { parsed := ParseRail(string(value)) if parsed != RailUnspecified { return parsed } clean := strings.ToUpper(strings.TrimSpace(string(value))) if clean == "" { return RailUnspecified } return Rail(clean) }