import { BigNumber } from 'libs/utils/BigNumber/utils' import { isEqualByD } from 'libs/utils/lodash' import { getDuplicatesRefinement } from 'libs/utils/zod' import { z } from 'zod' import { NameSchema } from './Name' /** * Allows defining unit conversion (e.g. from km to m) * * @see QuantitySchema */ export const ConversionSchema = z.object({ from: NameSchema, to: NameSchema, multiplier: z.instanceof(BigNumber), }).describe('Conversion') export const ConversionsSchema = z.array(ConversionSchema) .superRefine(getDuplicatesRefinement('Conversion', parseConversionUid)) export const ConversionUidSchema = ConversionSchema.pick({ from: true, to: true, }) export type Conversion = z.infer export type ConversionUid = z.infer export function parseConversion(conversion: Conversion): Conversion { return ConversionSchema.parse(conversion) } export function parseConversions(conversions: Conversion[]): Conversion[] { return ConversionsSchema.parse(conversions) } export function parseConversionUid(conversionUid: ConversionUid): ConversionUid { return ConversionUidSchema.parse(conversionUid) } export const isEqualConversion = (a: Conversion) => (b: Conversion) => isEqualByD(a, b, parseConversionUid)