i'm not sure what i've done wrong this time lol
project structure:
- tissue/
- src/
- app.gleam
- db.gleam
- error.gleam
- issue.gleam
- tissue.gleam
tissue.gleam:
import lustre
import app
pub fn main() {
let app = lustre.simple(app.init, app.update, app.view)
let assert Ok(_) = lustre.start(app, "#app", Nil)
}
app.gleam:
import gleam/int
import gleam/list
import db
import issue.{type Issue}
import lustre/attribute
import lustre/element.{type Element}
import lustre/element/html
import lustre/ui
pub type Model {
AllIssues(issues: List(Issue), failed_count: Int)
ViewIssue(issues: List(Issue), failed_count: Int, selected: Issue)
}
pub fn init(_flags) -> Model {
let assert Ok(#(issues, failed)) = db.load_all()
AllIssues(issues, failed |> list.length)
}
pub opaque type Msg {
UserClickedAllIssues
UserClickedViewIssue(issue: Issue)
}
pub fn update(model: Model, msg: Msg) -> Model {
case msg {
UserClickedAllIssues -> AllIssues(model.issues, model.failed_count)
UserClickedViewIssue(issue) ->
ViewIssue(model.issues, model.failed_count, selected: issue)
}
}
pub fn view(model: Model) -> Element(Msg) {
let styles = [#("width", "100vw"), #("height", "100vh"), #("padding", "1rem")]
ui.centre(
[attribute.style(styles)],
html.div([], [
html.h1([], [element.text("Issues")]),
ui.stack(
[],
model.issues
|> list.map(fn(a) {
html.p([], [
element.text("#" <> a.id |> int.to_string <> " - " <> a.title),
])
}),
),
]),
)
}
db.gleam:
import gleam/int
import gleam/list
import gleam/result
import simplifile
import error.{type Error}
import issue.{type Issue, Issue}
pub fn save(this issue: Issue) -> Result(Nil, simplifile.FileError) {
let directory = "./database/" <> issue.location <> "/"
let filename =
"#" <> issue.id |> int.to_string <> " - " <> issue.title <> ".json"
use _ <- result.try(simplifile.create_directory_all(directory))
simplifile.write(to: directory <> filename, contents: issue |> issue.to_json)
}
pub fn load(from path: String) -> Result(Issue, Error) {
simplifile.read(path)
|> result.map_error(error.File)
|> result.map(issue.from_json)
|> result.flatten
}
pub fn load_all() -> Result(#(List(Issue), List(Error)), Error) {
simplifile.get_files("./database")
|> result.map(fn(paths) {
paths |> list.map(load) |> list.reverse |> result.partition
})
|> result.map_error(error.File)
}
any idea what's wrong? i doubt error.gleam or issue.gleam are relevant, but i'll post them if needed
