aboutsummaryrefslogtreecommitdiffhomepage
path: root/internal/app/outcome.go
diff options
context:
space:
mode:
authorOphestra <cat@gensokyo.uk>2025-10-08 19:39:00 +0900
committerOphestra <cat@gensokyo.uk>2025-10-08 19:39:00 +0900
commitee6c471fe6e183d78e396a23b2a92fd26bb31143 (patch)
tree6d7eb6a6d7d057a840936e435150f30b57a8a2f3 /internal/app/outcome.go
parent16bf3178d358f72ce9605352364809b42229af5f (diff)
internal/app: relocate ops condition
This allows reuse and finer grained testing of fromConfig. Signed-off-by: Ophestra <cat@gensokyo.uk>
Diffstat (limited to 'internal/app/outcome.go')
-rw-r--r--internal/app/outcome.go42
1 files changed, 36 insertions, 6 deletions
diff --git a/internal/app/outcome.go b/internal/app/outcome.go
index f0880adb..671d14c0 100644
--- a/internal/app/outcome.go
+++ b/internal/app/outcome.go
@@ -118,16 +118,12 @@ func (s *outcomeState) populateLocal(k syscallDispatcher, msg container.Msg) err
// instancePath returns a path formatted for outcomeStateSys.instance.
// This method must only be called from outcomeOp.toContainer if
// outcomeOp.toSystem has already called outcomeStateSys.instance.
-func (s *outcomeState) instancePath() *check.Absolute {
- return s.sc.SharePath.Append(s.id.String())
-}
+func (s *outcomeState) instancePath() *check.Absolute { return s.sc.SharePath.Append(s.id.String()) }
// runtimePath returns a path formatted for outcomeStateSys.runtime.
// This method must only be called from outcomeOp.toContainer if
// outcomeOp.toSystem has already called outcomeStateSys.runtime.
-func (s *outcomeState) runtimePath() *check.Absolute {
- return s.sc.RunDirPath.Append(s.id.String())
-}
+func (s *outcomeState) runtimePath() *check.Absolute { return s.sc.RunDirPath.Append(s.id.String()) }
// outcomeStateSys wraps outcomeState and [system.I]. Used on the priv side only.
// Implementations of outcomeOp must not access fields other than sys unless explicitly stated.
@@ -212,3 +208,37 @@ type outcomeOp interface {
// by flattened env map.
toContainer(state *outcomeStateParams) error
}
+
+// fromConfig returns a corresponding slice of outcomeOp for [hst.Config].
+// This function assumes the caller has already called the Validate method on [hst.Config]
+// and checked that it returns nil.
+func fromConfig(config *hst.Config) (ops []outcomeOp) {
+ ops = []outcomeOp{
+ // must run first
+ &spParamsOp{},
+
+ // TODO(ophestra): move this late for #8 and #9
+ spFilesystemOp{},
+
+ spRuntimeOp{},
+ spTmpdirOp{},
+ spAccountOp{},
+ }
+
+ et := config.Enablements.Unwrap()
+ if et&hst.EWayland != 0 {
+ ops = append(ops, &spWaylandOp{})
+ }
+ if et&hst.EX11 != 0 {
+ ops = append(ops, &spX11Op{})
+ }
+ if et&hst.EPulse != 0 {
+ ops = append(ops, &spPulseOp{})
+ }
+ if et&hst.EDBus != 0 {
+ ops = append(ops, &spDBusOp{})
+ }
+
+ ops = append(ops, spFinal{})
+ return
+}