diff options
Diffstat (limited to 'pkg/app')
| -rw-r--r-- | pkg/app/app.go | 53 | ||||
| -rw-r--r-- | pkg/app/config.go | 45 | ||||
| -rw-r--r-- | pkg/app/paths/paths.go | 15 | ||||
| -rw-r--r-- | pkg/app/storage.go | 42 |
4 files changed, 155 insertions, 0 deletions
diff --git a/pkg/app/app.go b/pkg/app/app.go new file mode 100644 index 000000000..cb5f5e027 --- /dev/null +++ b/pkg/app/app.go @@ -0,0 +1,53 @@ +package app + +import ( + "context" + "log/slog" + "os" + "path/filepath" + + "github.com/sst/opencode/pkg/app/paths" +) + +type App struct { + ctx context.Context + directory string + config *Config + storage *Storage +} + +func New(ctx context.Context, directory string) (*App, error) { + var err error + app := &App{ + directory: directory, + ctx: ctx, + } + + data := paths.Data(directory) + if err := os.MkdirAll(data, 0755); err != nil { + return nil, err + } + + err = os.MkdirAll(paths.Log(directory), 0755) + if err != nil { + return nil, err + } + logFile, err := os.Create(filepath.Join(paths.Log(directory), "opencode.log")) + if err != nil { + return nil, err + } + slog.SetDefault(slog.New(slog.NewTextHandler(logFile, &slog.HandlerOptions{}))) + slog.Info("log created") + + app.config, err = initConfig(directory) + if err != nil { + return nil, err + } + + app.storage, err = initStorage(app) + if err != nil { + return nil, err + } + + return app, nil +} diff --git a/pkg/app/config.go b/pkg/app/config.go new file mode 100644 index 000000000..046606623 --- /dev/null +++ b/pkg/app/config.go @@ -0,0 +1,45 @@ +package app + +import ( + "os" + "path/filepath" + + "github.com/marcozac/go-jsonc" +) + +type Config struct { +} + +type ConfigMCP struct { +} + +type ConfigProvider struct { +} + +type ErrInvalidConfig struct { + source error +} + +func (e ErrInvalidConfig) Error() string { + return "ErrInvalidConfig" +} + +func (e ErrInvalidConfig) Unwrap() error { + return e.source +} + +func initConfig(directory string) (*Config, error) { + configPath := filepath.Join(directory, "opencode.jsonc") + _, err := os.Stat(configPath) + result := &Config{} + if err == nil { + data, err := os.ReadFile(configPath) + if err == nil { + err := jsonc.Unmarshal(data, result) + if err != nil { + return nil, ErrInvalidConfig{err} + } + } + } + return result, nil +} diff --git a/pkg/app/paths/paths.go b/pkg/app/paths/paths.go new file mode 100644 index 000000000..03efc85e0 --- /dev/null +++ b/pkg/app/paths/paths.go @@ -0,0 +1,15 @@ +package paths + +import "path/filepath" + +func Data(project string) string { + return filepath.Join(project, ".opencode") +} + +func Storage(project string) string { + return filepath.Join(Data(project), "storage") +} + +func Log(project string) string { + return filepath.Join(Data(project), "log") +} diff --git a/pkg/app/storage.go b/pkg/app/storage.go new file mode 100644 index 000000000..02a753894 --- /dev/null +++ b/pkg/app/storage.go @@ -0,0 +1,42 @@ +package app + +import ( + "log/slog" + "os" + "path/filepath" + + "github.com/sst/opencode/pkg/app/paths" + "gocloud.dev/blob" + "gocloud.dev/blob/fileblob" +) + +type Storage struct { + bucket *blob.Bucket + app *App + log *slog.Logger +} + +func initStorage(app *App) (*Storage, error) { + var err error + result := &Storage{ + app: app, + } + storageDir := paths.Storage(app.directory) + if err := os.MkdirAll(storageDir, 0755); err != nil { + return nil, err + } + result.bucket, err = fileblob.OpenBucket(storageDir, &fileblob.Options{ + NoTempDir: true, + }) + if err != nil { + return nil, err + } + return result, nil +} + +type StorageWriterOptions = blob.WriterOptions + +func (s *Storage) NewWriter(opts *StorageWriterOptions, path ...string) (*blob.Writer, error) { + joined := filepath.Join(path...) + return s.bucket.NewWriter(s.app.ctx, joined, nil) +} |
