Skip to content

Commit a53e003

Browse files
improve client error interface
1 parent 5613933 commit a53e003

File tree

1 file changed

+45
-21
lines changed

1 file changed

+45
-21
lines changed

src/services/rocket.py

Lines changed: 45 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,8 @@
1212
Tail as RocketPyTail,
1313
)
1414

15+
from fastapi import HTTPException, status
16+
1517
from src import logger
1618
from src.models.rocket import RocketModel, Parachute
1719
from src.models.sub.aerosurfaces import NoseCone, Tail, Fins
@@ -132,13 +134,20 @@ def get_rocketpy_nose(nose: NoseCone) -> RocketPyNoseCone:
132134
RocketPyNoseCone
133135
"""
134136

135-
rocketpy_nose = RocketPyNoseCone(
136-
name=nose.name,
137-
length=nose.length,
138-
kind=nose.kind,
139-
base_radius=nose.base_radius,
140-
rocket_radius=nose.rocket_radius,
141-
)
137+
try:
138+
rocketpy_nose = RocketPyNoseCone(
139+
name=nose.name,
140+
length=nose.length,
141+
kind=nose.kind,
142+
base_radius=nose.base_radius,
143+
rocket_radius=nose.rocket_radius,
144+
)
145+
except ValueError as exc:
146+
raise HTTPException(
147+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
148+
detail=str(exc),
149+
) from exc
150+
142151
rocketpy_nose.position = nose.position
143152
return rocketpy_nose
144153

@@ -159,25 +168,40 @@ def get_rocketpy_finset(fins: Fins, kind: str) -> RocketPyFins:
159168
RocketPyTrapezoidalFins
160169
RocketPyEllipticalFins
161170
"""
171+
172+
if fins.rocket_radius is None:
173+
raise HTTPException(
174+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
175+
detail="Fin definition missing required field 'rocket_radius'",
176+
)
177+
178+
base_kwargs = {
179+
'n': fins.n,
180+
'name': fins.name,
181+
'root_chord': fins.root_chord,
182+
'span': fins.span,
183+
'rocket_radius': fins.rocket_radius,
184+
}
185+
162186
match kind:
163187
case "trapezoidal":
164-
rocketpy_finset = RocketPyTrapezoidalFins(
165-
n=fins.n,
166-
name=fins.name,
167-
root_chord=fins.root_chord,
168-
span=fins.span,
169-
**fins.get_additional_parameters(),
170-
)
188+
factory = RocketPyTrapezoidalFins
171189
case "elliptical":
172-
rocketpy_finset = RocketPyEllipticalFins(
173-
n=fins.n,
174-
name=fins.name,
175-
root_chord=fins.root_chord,
176-
span=fins.span,
177-
**fins.get_additional_parameters(),
178-
)
190+
factory = RocketPyEllipticalFins
179191
case _:
180192
raise ValueError(f"Invalid fins kind: {kind}")
193+
194+
try:
195+
rocketpy_finset = factory(
196+
**base_kwargs,
197+
**fins.get_additional_parameters(),
198+
)
199+
except (TypeError, ValueError) as exc:
200+
raise HTTPException(
201+
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
202+
detail=str(exc),
203+
) from exc
204+
181205
rocketpy_finset.position = fins.position
182206
return rocketpy_finset
183207

0 commit comments

Comments
 (0)