I have a simple todos table in sqlite that I'm trying to query using gleam, my code is as follows:
pub type Todo {
Todo(id: Int, title: String, completed: Int)
}
fn todo_encoder() -> decode.Decoder(Todo) {
let encoder = {
use id <- decode.field("id", decode.int)
use title <- decode.field("title", decode.string)
use completed <- decode.field("completed", decode.int)
decode.success(Todo(id: id, title: title, completed: completed))
}
encoder
}
fn db_directory() {
let assert Ok(priv_directory) = wisp.priv_directory("app")
echo "Private directory: " <> priv_directory
priv_directory <> "/data/"
}
fn open_db_conn() {
let db_conn = sqlight.open(db_directory() <> "app.db")
case db_conn {
Ok(conn) -> {
echo "Database connection established."
Ok(conn)
}
Error(err) -> {
Error(err)
}
}
}
pub fn get_todos() -> Result(List(Todo), sqlight.Error) {
let assert Ok(conn) = open_db_conn()
let todos = sqlight.query("SELECT * FROM todos", conn, [], todo_encoder())
case todos {
Ok(results) -> {
echo "Retrieved todos successfully."
Ok(results)
}
Error(error) -> {
echo "Error retrieving todos: " <> error.message
Error(error)
}
}
}
I keep seeing this error when I call get_todos:
"Error retrieving todos: Decoder failed, expected Dict, got Tuple of 3 elements in "
My Decoder seems correct, and my call to open the db also looks correct, what am I doing wrong?
Updated the decoder code:
fn todo_decoder() -> decode.Decoder(Todo) {
{
use id <- decode.field(0, decode.int)
use title <- decode.field(1, decode.string)
use completed <- decode.field(2, decode.int)
decode.success(Todo(id: id, title: title, completed: completed))
}
}