namespace MyWarehouse.Domain.Common.ValueObjects.Money;
/// <summary>
/// Value object that represents currency. Simplified sample.
/// </summary>
public record Currency
{
public string Code { get; init; }
public string Symbol { get; init; }
public bool SymbolWellKnown { get; init; } = false;
private static readonly IReadOnlyDictionary<string, Record> _lookup = new Dictionary<string, Record>()
{
["USD"] = new Record("USD", "$", symbolWellKnown: true),
["EUR"] = new Record("EUR", "€", symbolWellKnown: true),
["JPY"] = new Record("JPY", "¥", symbolWellKnown: true),
["GBP"] = new Record("GBP", "£", symbolWellKnown: true),
["CAD"] = new Record("CAD", "C$"),
["AUD"] = new Record("AUD", "A$"),
["CHF"] = new Record("CHF", "Fr."),
["NZD"] = new Record("NZD", "NZ$"),
["RUB"] = new Record("RUB", "₽"),
["HUF"] = new Record("HUF", "Ft"),
};
private Currency(Record record)
=> (Code, Symbol, SymbolWellKnown) = (record.Code, record.Symbol, record.SymbolWellKnown);
/// <summary>
/// Returns a currency instance from the provided ISO currency code string.
/// </summary>
/// <param name="code">Three letter ISO currency code.</param>
/// <exception cref="ArgumentException">Thrown when the provided code is not valid or not supported by the system.</exception>
public static Currency FromCode(string code)
{
if (!_lookup.TryGetValue(code.ToUpper(), out var record))
throw new ArgumentException($"Code '{code}' is not a currency code we recognize.", nameof(code));
return new Currency(record);
}
public static bool IsValidCurrencyCode(string code)
=> _lookup.ContainsKey(code);
public static List<Currency> GetAllCurrencies
=> _lookup.Select(x => new Currency(x.Value)).ToList();
public override string ToString()
=> Code;
/// <summary>
/// Returns an instance of the currency that is deemed default for the domain.
/// </summary>
public static Currency Default => USD;
public static Currency USD = new Currency(_lookup["USD"]);
public static Currency EUR = new Currency(_lookup["EUR"]);
public static Currency JPY = new Currency(_lookup["JPY"]);
public static Currency GBP = new Currency(_lookup["GBP"]);
public static Currency CAD = new Currency(_lookup["CAD"]);
public static Currency AUD = new Currency(_lookup["AUD"]);
public static Currency CHF = new Currency(_lookup["CHF"]);
public static Currency NZD = new Currency(_lookup["NZD"]);
public static Currency RUB = new Currency(_lookup["RUB"]);
public static Currency HUF = new Currency(_lookup["HUF"]);
private readonly struct Record
{
public readonly string Code;
public readonly string Symbol;
public readonly bool SymbolWellKnown;
public Record(string code, string symbol, bool symbolWellKnown = false)
=> (Code, Symbol, SymbolWellKnown) = (code, symbol, symbolWellKnown);
}
}