-
1
-
2
-
3
-
4
-
5
-
6
-
7
-
8
-
9
-
10
-
11
-
12
-
13
-
14
-
15
-
16
-
17
-
18
-
19
-
20
-
21
-
22
-
23
-
24
-
25
-
26
-
27
-
28
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
// SPDX-FileCopyrightText: 2025 Shota FUJI <pockawoooh@gmail.com>
// SPDX-License-Identifier: AGPL-3.0-only
//go:build !js && !wasm
package main
import (
"database/sql"
_ "embed"
"flag"
"log/slog"
"net/http"
"os"
"golang.org/x/net/http2"
"golang.org/x/net/http2/h2c"
"pocka.jp/x/yamori/backend/core"
"pocka.jp/x/yamori/backend/services"
_ "modernc.org/sqlite"
)
var adminCreationPassword = flag.String(
"admin-creation-password", "", "Password for creating a user when there is no admin user in workspace",
)
var verbose = flag.Bool(
"verbose", false, "Whether output debug logs",
)
// TODO: エラーコードを定義する
func main() {
flag.Parse()
logLevel := slog.LevelInfo
if verbose != nil && *verbose {
logLevel = slog.LevelDebug
}
// TODO: CLI 引数で JSONL ロガーと charmbracelet/log を選べるようにする
logger := slog.New(slog.NewJSONHandler(os.Stdout, &slog.HandlerOptions{
Level: logLevel,
}))
db, err := sql.Open("sqlite", ":memory:")
if err != nil {
logger.Error("Failed to open database", "error", err)
os.Exit(2)
}
core, err := core.New(db, logger)
if err != nil {
logger.Error("Failed to create core instance", "error", err)
os.Exit(3)
}
if err := core.Init(*adminCreationPassword); err != nil {
logger.Error("Failed to prepare application core", "error", err)
os.Exit(4)
}
mux := services.Mux(core)
http.ListenAndServe("localhost:8765", h2c.NewHandler(mux, &http2.Server{}))
}