internal/app: remove app interface
All checks were successful
Test / Create distribution (push) Successful in 36s
Test / Sandbox (push) Successful in 2m6s
Test / Hakurei (push) Successful in 3m21s
Test / Hpkg (push) Successful in 3m47s
Test / Sandbox (race detector) (push) Successful in 4m22s
Test / Hakurei (race detector) (push) Successful in 5m16s
Test / Flake checks (push) Successful in 1m36s

It is very clear at this point that there will not be multiple implementations of App, and the internal/app package will never move out of internal due to hsu.

Signed-off-by: Ophestra <cat@gensokyo.uk>
This commit is contained in:
Ophestra 2025-08-28 00:54:44 +09:00
parent da0459aca1
commit d0b6852cd7
Signed by: cat
SSH Key Fingerprint: SHA256:gQ67O0enBZ7UdZypgtspB2FDM1g3GVw8nX0XSdcFw8Q
3 changed files with 14 additions and 26 deletions

View File

@ -4,22 +4,8 @@ package app
import ( import (
"syscall" "syscall"
"time" "time"
"hakurei.app/hst"
"hakurei.app/internal/app/state"
) )
type App interface {
// ID returns a copy of [state.ID] held by App.
ID() state.ID
// Seal determines the outcome of config as a [SealedApp].
// The value of config might be overwritten and must not be used again.
Seal(config *hst.Config) (SealedApp, error)
String() string
}
type SealedApp interface { type SealedApp interface {
// Run commits sealed system setup and starts the app process. // Run commits sealed system setup and starts the app process.
Run(rs *RunState) error Run(rs *RunState) error

View File

@ -11,8 +11,8 @@ import (
"hakurei.app/internal/sys" "hakurei.app/internal/sys"
) )
func New(ctx context.Context, os sys.State) (App, error) { func New(ctx context.Context, os sys.State) (*App, error) {
a := new(app) a := new(App)
a.sys = os a.sys = os
a.ctx = ctx a.ctx = ctx
@ -23,7 +23,7 @@ func New(ctx context.Context, os sys.State) (App, error) {
return a, err return a, err
} }
func MustNew(ctx context.Context, os sys.State) App { func MustNew(ctx context.Context, os sys.State) *App {
a, err := New(ctx, os) a, err := New(ctx, os)
if err != nil { if err != nil {
log.Fatalf("cannot create app: %v", err) log.Fatalf("cannot create app: %v", err)
@ -31,7 +31,7 @@ func MustNew(ctx context.Context, os sys.State) App {
return a return a
} }
type app struct { type App struct {
id *stringPair[state.ID] id *stringPair[state.ID]
sys sys.State sys sys.State
ctx context.Context ctx context.Context
@ -40,9 +40,10 @@ type app struct {
mu sync.RWMutex mu sync.RWMutex
} }
func (a *app) ID() state.ID { a.mu.RLock(); defer a.mu.RUnlock(); return a.id.unwrap() } // ID returns a copy of [state.ID] held by App.
func (a *App) ID() state.ID { a.mu.RLock(); defer a.mu.RUnlock(); return a.id.unwrap() }
func (a *app) String() string { func (a *App) String() string {
if a == nil { if a == nil {
return "(invalid app)" return "(invalid app)"
} }
@ -60,7 +61,9 @@ func (a *app) String() string {
return fmt.Sprintf("(unsealed app %s)", a.id) return fmt.Sprintf("(unsealed app %s)", a.id)
} }
func (a *app) Seal(config *hst.Config) (SealedApp, error) { // Seal determines the outcome of [hst.Config] as a [SealedApp].
// Values stored in and referred to by [hst.Config] might be overwritten and must not be used again.
func (a *App) Seal(config *hst.Config) (SealedApp, error) {
a.mu.Lock() a.mu.Lock()
defer a.mu.Unlock() defer a.mu.Unlock()

View File

@ -7,17 +7,16 @@ import (
"hakurei.app/system" "hakurei.app/system"
) )
func NewWithID(id state.ID, os sys.State) App { func NewWithID(id state.ID, os sys.State) *App {
a := new(app) a := new(App)
a.id = newID(&id) a.id = newID(&id)
a.sys = os a.sys = os
return a return a
} }
func AppIParams(a App, sa SealedApp) (*system.I, *container.Params) { func AppIParams(a *App, sa SealedApp) (*system.I, *container.Params) {
v := a.(*app)
seal := sa.(*outcome) seal := sa.(*outcome)
if v.outcome != seal || v.id != seal.id { if a.outcome != seal || a.id != seal.id {
panic("broken app/outcome link") panic("broken app/outcome link")
} }
return seal.sys, seal.container return seal.sys, seal.container