mirror of
https://github.com/mauriceboe/TREK.git
synced 2026-10-18 21:16:47 +00:00
40 lines
1.7 KiB
TypeScript
40 lines
1.7 KiB
TypeScript
import { z } from 'zod';
|
|
|
|
const clock = z.union([z.literal(''), z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/)]);
|
|
const amount = z.number().finite().nonnegative();
|
|
|
|
export const roadtripPreferencesSchema = z
|
|
.object({
|
|
roadtrip_leg_minutes: amount.max(1440).optional(),
|
|
roadtrip_day_minutes: amount.max(1440).optional(),
|
|
roadtrip_day_start: clock.optional(),
|
|
roadtrip_day_end: clock.optional(),
|
|
roadtrip_day_end_mode: z.enum(['route', 'stop']).optional(),
|
|
roadtrip_range_km: amount.max(40000).optional(),
|
|
roadtrip_vehicle: z.enum(['', 'combustion', 'electric']).optional(),
|
|
roadtrip_fill_percent: amount.max(100).optional(),
|
|
roadtrip_tank_litres: amount.max(10000).optional(),
|
|
roadtrip_litres_per_100: amount.max(1000).optional(),
|
|
roadtrip_battery_kwh: amount.max(10000).optional(),
|
|
roadtrip_kwh_per_100: amount.max(1000).optional(),
|
|
roadtrip_battery_degradation: amount.max(100).optional(),
|
|
roadtrip_connect_days: z.boolean().optional(),
|
|
roadtrip_day_colors: z.boolean().optional(),
|
|
roadtrip_avoid: z
|
|
.string()
|
|
.max(32)
|
|
.refine(
|
|
(value) => value === '' || value.split(',').every((part) => ['toll', 'motorway', 'ferry'].includes(part)),
|
|
'Expected a comma-separated selection of toll, motorway, ferry',
|
|
)
|
|
.optional(),
|
|
})
|
|
.strict();
|
|
|
|
export const roadtripPreferencesUpdateSchema = roadtripPreferencesSchema.refine(
|
|
(value) => Object.keys(value).length > 0,
|
|
'Provide at least one driving preference',
|
|
);
|
|
export type RoadtripPreferences = z.infer<typeof roadtripPreferencesSchema>;
|
|
export const ROADTRIP_PREFERENCE_KEYS = Object.keys(roadtripPreferencesSchema.shape) as (keyof RoadtripPreferences)[];
|