File size: 2,130 Bytes
ee4ef53 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 | """
Input validation and parsing for pet profiles.
"""
import logging
from typing import Dict, Optional
from schema import (
PetType,
Gender,
LifeStage,
ActivityLevel,
PregnantLactating,
NeuteredSpayed,
PetProfile,
)
logger = logging.getLogger(__name__)
class InputHandler:
@staticmethod
def create_handler() -> "InputHandler":
return InputHandler()
def validate_and_parse(self, user_input: Dict) -> Optional[PetProfile]:
try:
profile = PetProfile(
pet_type=PetType(user_input["pet_type"].lower()),
breed=user_input["breed"].strip(),
gender=Gender(user_input["gender"].lower()),
pregnant_lactating=PregnantLactating(
(user_input.get("pregnant_lactating") or "none").lower()
),
weight_kg=float(user_input["weight_kg"]),
activity_level=ActivityLevel(user_input["activity_level"].lower()),
life_stage=LifeStage(user_input["life_stage"].lower()),
bcs=int(user_input["bcs"]),
neutered_spayed=NeuteredSpayed(user_input["neutered_spayed"].lower()),
allergies=user_input.get("allergies"),
diseases=user_input.get("diseases"),
diet_preference=user_input["diet_preference"],
current_food_format=user_input["current_food_format"],
)
# Logical validations
if profile.gender == Gender.MALE and profile.pregnant_lactating != PregnantLactating.NONE:
raise ValueError("Male pets cannot be pregnant or lactating")
if profile.pet_type == PetType.DOG and profile.life_stage == LifeStage.KITTEN:
raise ValueError("Dog cannot have kitten life stage")
if profile.pet_type == PetType.CAT and profile.life_stage == LifeStage.PUPPY:
raise ValueError("Cat cannot have puppy life stage")
return profile
except Exception as e:
logger.error(f"Input validation failed: {e}")
return None
|