Files
sendico/api/payments/storage/model/rails.go
2026-02-27 02:33:40 +01:00

66 lines
1.9 KiB
Go

package model
import (
"github.com/tech/sendico/pkg/discovery"
"strings"
)
var supportedRails = map[Rail]struct{}{
discovery.RailCrypto: {},
discovery.RailProviderSettlement: {},
discovery.RailLedger: {},
discovery.RailCardPayout: {},
discovery.RailFiatOnRamp: {},
discovery.RailFiatOffRamp: {},
}
// ParseRail canonicalizes string values into a Rail token.
func ParseRail(value string) Rail {
clean := strings.ToUpper(strings.TrimSpace(value))
if clean == "" {
return discovery.RailUnspecified
}
clean = strings.ReplaceAll(clean, "-", "_")
clean = strings.ReplaceAll(clean, " ", "_")
for strings.Contains(clean, "__") {
clean = strings.ReplaceAll(clean, "__", "_")
}
switch clean {
case string(discovery.RailCrypto), "RAIL_CRYPTO":
return discovery.RailCrypto
case string(discovery.RailProviderSettlement), "PROVIDER_SETTLEMENT", "RAIL_SETTLEMENT", "RAIL_PROVIDER_SETTLEMENT":
return discovery.RailProviderSettlement
case string(discovery.RailLedger), "RAIL_LEDGER":
return discovery.RailLedger
case string(discovery.RailCardPayout), "CARD_PAYOUT", "RAIL_CARD", "RAIL_CARD_PAYOUT":
return discovery.RailCardPayout
case string(discovery.RailFiatOnRamp), "FIAT_ONRAMP", "RAIL_ONRAMP", "RAIL_FIAT_ONRAMP":
return discovery.RailFiatOnRamp
case string(discovery.RailFiatOffRamp), "FIAT_OFFRAMP", "RAIL_OFFRAMP", "RAIL_FIAT_OFFRAMP":
return discovery.RailFiatOffRamp
default:
return discovery.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 != discovery.RailUnspecified {
return parsed
}
clean := strings.ToUpper(strings.TrimSpace(string(value)))
if clean == "" {
return discovery.RailUnspecified
}
return Rail(clean)
}