measurements / app.py
slimshadow's picture
Create app.py
616000a verified
from fastapi import FastAPI, HTTPException
app = FastAPI()
# Conversion functions
def convert_length(value: float, from_unit: str, to_unit: str) -> float:
length_units = {"meters": 1, "kilometers": 0.001, "miles": 0.000621371, "feet": 3.28084}
if from_unit not in length_units or to_unit not in length_units:
raise ValueError("Invalid length units")
return value * (length_units[to_unit] / length_units[from_unit])
def convert_weight(value: float, from_unit: str, to_unit: str) -> float:
weight_units = {"grams": 1, "kilograms": 0.001, "pounds": 0.00220462, "ounces": 0.035274}
if from_unit not in weight_units or to_unit not in weight_units:
raise ValueError("Invalid weight units")
return value * (weight_units[to_unit] / weight_units[from_unit])
def convert_temperature(value: float, from_unit: str, to_unit: str) -> float:
if from_unit == "celsius" and to_unit == "fahrenheit":
return value * 9/5 + 32
elif from_unit == "fahrenheit" and to_unit == "celsius":
return (value - 32) * 5/9
elif from_unit == "celsius" and to_unit == "kelvin":
return value + 273.15
elif from_unit == "kelvin" and to_unit == "celsius":
return value - 273.15
elif from_unit == "fahrenheit" and to_unit == "kelvin":
return (value - 32) * 5/9 + 273.15
elif from_unit == "kelvin" and to_unit == "fahrenheit":
return (value - 273.15) * 9/5 + 32
elif from_unit == to_unit:
return value
else:
raise ValueError("Invalid temperature conversion")
# API endpoints
@app.get("/convert/{category}")
async def convert_units(category: str, value: float, from_unit: str, to_unit: str):
try:
if category == "length":
result = convert_length(value, from_unit, to_unit)
elif category == "weight":
result = convert_weight(value, from_unit, to_unit)
elif category == "temperature":
result = convert_temperature(value, from_unit, to_unit)
else:
raise HTTPException(status_code=400, detail="Invalid category")
return {"value": value, "from_unit": from_unit, "to_unit": to_unit, "result": result}
except ValueError as e:
raise HTTPException(status_code=400, detail=str(e))