From 05d83c52c30b6c5144553d48ebbd7eb2d240bd4d Mon Sep 17 00:00:00 2001 From: juancwu Date: Wed, 28 Jan 2026 15:10:25 +0000 Subject: [PATCH] init project --- cmd/cli/main.go | 28 +++++++++++++++ go.mod | 3 ++ internal/cli/cli.go | 13 +++++++ internal/config/config.go | 72 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 116 insertions(+) create mode 100644 cmd/cli/main.go create mode 100644 go.mod create mode 100644 internal/cli/cli.go create mode 100644 internal/config/config.go diff --git a/cmd/cli/main.go b/cmd/cli/main.go new file mode 100644 index 0000000..fa19a92 --- /dev/null +++ b/cmd/cli/main.go @@ -0,0 +1,28 @@ +package main + +import ( + "flag" + "fmt" + "os" + + "git.juancwu.dev/juancwu/forgejo-cli/internal/cli" + "git.juancwu.dev/juancwu/forgejo-cli/internal/config" +) + +func main() { + var configPath string + flag.StringVar(&configPath, "config", "", "Configuration file path") + + cfg, err := config.Load(configPath) + if err != nil { + fmt.Println(err) + os.Exit(1) + } + + model := cli.New(cfg) + err = model.Run() + if err != nil { + fmt.Println(err) + os.Exit(1) + } +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..f56602e --- /dev/null +++ b/go.mod @@ -0,0 +1,3 @@ +module git.juancwu.dev/juancwu/forgejo-cli + +go 1.25.6 diff --git a/internal/cli/cli.go b/internal/cli/cli.go new file mode 100644 index 0000000..4009922 --- /dev/null +++ b/internal/cli/cli.go @@ -0,0 +1,13 @@ +package cli + +import "git.juancwu.dev/juancwu/forgejo-cli/internal/config" + +type Model struct{} + +func New(cfg *config.Config) *Model { + return &Model{} +} + +func (m *Model) Run() error { + return nil +} diff --git a/internal/config/config.go b/internal/config/config.go new file mode 100644 index 0000000..327640c --- /dev/null +++ b/internal/config/config.go @@ -0,0 +1,72 @@ +package config + +import ( + "encoding/json" + "fmt" + "os" + "path/filepath" +) + +type Config struct { + ForgejoInstanceURL string `json:"forgejo_instance_url"` +} + +// Load tries to load a saved configuration. +func Load(path string) (*Config, error) { + var err error + if path == "" { + path, err = getUserConfigDir() + if err != nil { + return nil, fmt.Errorf("failed to load config: %w", err) + } + } + + if _, err := os.Stat(path); os.IsNotExist(err) { + return &Config{}, nil + } + + fileData, err := os.ReadFile(path) + if err != nil { + return nil, fmt.Errorf("failed to read config file: %w", err) + } + + var cfg Config + err = json.Unmarshal(fileData, &cfg) + if err != nil { + return nil, fmt.Errorf("failed to unmarshal config file: %w", err) + } + + return &cfg, nil +} + +func (cfg *Config) Save(path string) error { + var err error + if path == "" { + path, err = getUserConfigDir() + if err != nil { + return fmt.Errorf("failed to save config: %w", err) + } + } + + fileData, err := json.MarshalIndent(cfg, "", " ") + if err != nil { + return fmt.Errorf("failed to marshal config: %w", err) + } + + err = os.WriteFile(path, fileData, 0600) + if err != nil { + return fmt.Errorf("failed to write config file: %w", err) + } + + return nil +} + +// getUserConfigDir creates the full path to the config file. +func getUserConfigDir() (string, error) { + userConfigPath, err := os.UserConfigDir() + if err != nil { + return "", fmt.Errorf("failed to get user configuration path: %w", err) + } + filename := filepath.Join(userConfigPath, "forgejo-cli", "config.json") + return filename, nil +}