import { reactive, watch, type Ref } from 'vue'; type UseValidationRule = { validator: (value: T) => boolean; message: string; }; export function useValidation({ source, rules }: { source: Ref; rules: UseValidationRule[] }) { const state = reactive<{ message: string; status: undefined | 'error'; }>({ message: '', status: undefined, }); watch([source], () => { state.message = ''; state.status = undefined; for (const rule of rules) { if (!rule.validator(source.value)) { state.message = rule.message; state.status = 'error'; } } }); return state; }