Skip to content

Commit 1831bd3

Browse files
committed
feat: FastAPI async handlers
1 parent 72f09b2 commit 1831bd3

File tree

2 files changed

+35
-24
lines changed

2 files changed

+35
-24
lines changed

.config/dotnet-tools.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
"rollForward": false
1111
},
1212
"fable": {
13-
"version": "5.0.0-alpha.20",
13+
"version": "5.0.0-alpha.21",
1414
"commands": [
1515
"fable"
1616
],

examples/fastapi/App.fs

Lines changed: 34 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
/// Demonstrates how to use Fable.Python.FastAPI with decorator attributes
33
module App
44

5+
open System.Threading.Tasks
56
open Fable.Core
67
open Fable.Python.FastAPI
78
open Fable.Python.Pydantic
@@ -36,36 +37,42 @@ items.Add(item2)
3637
type API() =
3738
/// Root endpoint - welcome message
3839
[<Get("/")>]
39-
static member root() : obj =
40-
{| message = "Welcome to Fable.Python + FastAPI!"
40+
static member root() : Task<obj> = task {
41+
return {|
42+
message = "Welcome to Fable.Python + FastAPI!"
4143
version = "1.0.0" |}
44+
}
4245

4346
/// Health check endpoint
4447
[<Get("/health")>]
45-
static member health() : obj =
46-
{| status = "healthy"
48+
static member health() : Task<obj> = task {
49+
return {|
50+
status = "healthy"
4751
users_count = users.Count
4852
items_count = items.Count |}
53+
}
4954

5055
/// Get all users
5156
[<Get("/users")>]
52-
static member get_users() : ResizeArray<User> =
53-
users
57+
static member get_users() : Task<ResizeArray<User>> = task {
58+
return users
59+
}
5460

5561
/// Get a user by ID
5662
[<Get("/users/{user_id}")>]
57-
static member get_user(user_id: int) : obj =
63+
static member get_user(user_id: int) : Task<obj> = task {
5864
match users |> Seq.tryFind (fun u -> u.Id = user_id) with
59-
| Some user -> user :> obj
60-
| None -> {| error = "User not found" |}
61-
65+
| Some user -> return user :> obj
66+
| None -> return {| error = "User not found" |}
67+
}
6268
/// Create a new user
6369
[<Post("/users")>]
64-
static member create_user(request: CreateUserRequest) : obj =
70+
static member create_user(request: CreateUserRequest) = task {
6571
let newId = if users.Count = 0 then 1 else (users |> Seq.map (fun u -> u.Id) |> Seq.max) + 1
6672
let newUser = User(Id = newId, Name = request.Name, Email = request.Email)
6773
users.Add(newUser)
68-
{| status = "created"; user = newUser |}
74+
return {| status = "created"; user = newUser |}
75+
}
6976

7077
/// Get all items
7178
[<Get("/items")>]
@@ -74,34 +81,38 @@ type API() =
7481

7582
/// Get an item by ID
7683
[<Get("/items/{item_id}")>]
77-
static member get_item(item_id: int) : obj =
84+
static member get_item(item_id: int) : Task<obj> = task {
7885
match items |> Seq.tryFind (fun i -> i.Id = item_id) with
79-
| Some item -> item :> obj
80-
| None -> {| error = "Item not found" |}
86+
| Some item -> return item :> obj
87+
| None -> return {| error = "Item not found" |}
88+
}
8189

8290
/// Create a new item
8391
[<Post("/items")>]
84-
static member create_item(request: CreateItemRequest) : obj =
92+
static member create_item(request: CreateItemRequest) : Task<obj> = task {
8593
let newId = if items.Count = 0 then 1 else (items |> Seq.map (fun i -> i.Id) |> Seq.max) + 1
8694
let newItem = Item(Id = newId, Name = request.Name, Price = request.Price, InStock = request.InStock)
8795
items.Add(newItem)
88-
{| status = "created"; item = newItem |}
96+
return {| status = "created"; item = newItem |}
97+
}
8998

9099
/// Update an item
91100
[<Put("/items/{item_id}")>]
92-
static member update_item(item_id: int, request: CreateItemRequest) : obj =
101+
static member update_item(item_id: int, request: CreateItemRequest) : Task<obj> = task {
93102
match items |> Seq.tryFindIndex (fun i -> i.Id = item_id) with
94103
| Some index ->
95104
let updatedItem = Item(Id = item_id, Name = request.Name, Price = request.Price, InStock = request.InStock)
96105
items.[index] <- updatedItem
97-
{| status = "updated"; item = updatedItem |}
98-
| None -> {| error = "Item not found" |}
106+
return {| status = "updated"; item = updatedItem |}
107+
| None -> return {| error = "Item not found" |}
108+
}
99109

100110
/// Delete an item
101111
[<Delete("/items/{item_id}")>]
102-
static member delete_item(item_id: int) : obj =
112+
static member delete_item(item_id: int) : Task<obj> = task {
103113
match items |> Seq.tryFindIndex (fun i -> i.Id = item_id) with
104114
| Some index ->
105115
items.RemoveAt(index)
106-
{| status = "deleted"; deleted_id = nativeint item_id |}
107-
| None -> {| error = "Item not found" |}
116+
return {| status = "deleted"; deleted_id = nativeint item_id |}
117+
| None -> return {| error = "Item not found" |}
118+
}

0 commit comments

Comments
 (0)