| """ |
| 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"], |
| ) |
|
|
| |
| 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 |
|
|