Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion .config/dotnet-tools.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@
"rollForward": false
},
"fable": {
"version": "5.0.0-alpha.20",
"version": "5.0.0-alpha.21",
"commands": [
"fable"
],
Expand Down
57 changes: 34 additions & 23 deletions examples/fastapi/App.fs
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
/// Demonstrates how to use Fable.Python.FastAPI with decorator attributes
module App

open System.Threading.Tasks
open Fable.Core
open Fable.Python.FastAPI
open Fable.Python.Pydantic
Expand Down Expand Up @@ -36,36 +37,42 @@ items.Add(item2)
type API() =
/// Root endpoint - welcome message
[<Get("/")>]
static member root() : obj =
{| message = "Welcome to Fable.Python + FastAPI!"
static member root() : Task<obj> = task {
return {|
message = "Welcome to Fable.Python + FastAPI!"
version = "1.0.0" |}
}

/// Health check endpoint
[<Get("/health")>]
static member health() : obj =
{| status = "healthy"
static member health() : Task<obj> = task {
return {|
status = "healthy"
users_count = users.Count
items_count = items.Count |}
}

/// Get all users
[<Get("/users")>]
static member get_users() : ResizeArray<User> =
users
static member get_users() : Task<ResizeArray<User>> = task {
return users
}

/// Get a user by ID
[<Get("/users/{user_id}")>]
static member get_user(user_id: int) : obj =
static member get_user(user_id: int) : Task<obj> = task {
match users |> Seq.tryFind (fun u -> u.Id = user_id) with
| Some user -> user :> obj
| None -> {| error = "User not found" |}

| Some user -> return user :> obj
| None -> return {| error = "User not found" |}
}
/// Create a new user
[<Post("/users")>]
static member create_user(request: CreateUserRequest) : obj =
static member create_user(request: CreateUserRequest) = task {
let newId = if users.Count = 0 then 1 else (users |> Seq.map (fun u -> u.Id) |> Seq.max) + 1
let newUser = User(Id = newId, Name = request.Name, Email = request.Email)
users.Add(newUser)
{| status = "created"; user = newUser |}
return {| status = "created"; user = newUser |}
}

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

/// Get an item by ID
[<Get("/items/{item_id}")>]
static member get_item(item_id: int) : obj =
static member get_item(item_id: int) : Task<obj> = task {
match items |> Seq.tryFind (fun i -> i.Id = item_id) with
| Some item -> item :> obj
| None -> {| error = "Item not found" |}
| Some item -> return item :> obj
| None -> return {| error = "Item not found" |}
}

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

/// Update an item
[<Put("/items/{item_id}")>]
static member update_item(item_id: int, request: CreateItemRequest) : obj =
static member update_item(item_id: int, request: CreateItemRequest) : Task<obj> = task {
match items |> Seq.tryFindIndex (fun i -> i.Id = item_id) with
| Some index ->
let updatedItem = Item(Id = item_id, Name = request.Name, Price = request.Price, InStock = request.InStock)
items.[index] <- updatedItem
{| status = "updated"; item = updatedItem |}
| None -> {| error = "Item not found" |}
return {| status = "updated"; item = updatedItem |}
| None -> return {| error = "Item not found" |}
}

/// Delete an item
[<Delete("/items/{item_id}")>]
static member delete_item(item_id: int) : obj =
static member delete_item(item_id: int) : Task<obj> = task {
match items |> Seq.tryFindIndex (fun i -> i.Id = item_id) with
| Some index ->
items.RemoveAt(index)
{| status = "deleted"; deleted_id = nativeint item_id |}
| None -> {| error = "Item not found" |}
return {| status = "deleted"; deleted_id = nativeint item_id |}
| None -> return {| error = "Item not found" |}
}