about summary refs log tree commit diff
path: root/tvix/castore/src
diff options
context:
space:
mode:
authorYureka <tvl@yuka.dev>2024-07-18T15·27+0200
committeryuka <tvl@yuka.dev>2024-07-18T18·47+0000
commitb8415a94d990fa99dcc9ae40112cae76fef83be1 (patch)
tree812ac07756476c3446242d1aa63c275ae26eb06a /tvix/castore/src
parent1a6b6e3ef310c8eea37b55f8007c85a8772ff8e9 (diff)
feat(tvix/composition): allow creating a blank CompositionContext r/8366
this is useful when oneshot-instantiating a store from a single config

Change-Id: I08538fdee1d0bb26b3ae2da7d3b2339b2e93bc0a
Reviewed-on: https://cl.tvl.fyi/c/depot/+/11975
Reviewed-by: flokli <flokli@flokli.de>
Autosubmit: yuka <yuka@yuka.dev>
Tested-by: BuildkiteCI
Diffstat (limited to 'tvix/castore/src')
-rw-r--r--tvix/castore/src/composition.rs19
1 files changed, 13 insertions, 6 deletions
diff --git a/tvix/castore/src/composition.rs b/tvix/castore/src/composition.rs
index 88cedcb832d0..cd4064af9a3e 100644
--- a/tvix/castore/src/composition.rs
+++ b/tvix/castore/src/composition.rs
@@ -218,10 +218,17 @@ pub fn add_default_services(reg: &mut Registry) {
 
 pub struct CompositionContext<'a, T: ?Sized> {
     stack: Vec<String>,
-    composition: &'a Composition<T>,
+    composition: Option<&'a Composition<T>>,
 }
 
 impl<'a, T: ?Sized + Send + Sync + 'static> CompositionContext<'a, T> {
+    pub fn blank() -> Self {
+        Self {
+            stack: Default::default(),
+            composition: None,
+        }
+    }
+
     pub async fn resolve(
         &self,
         entrypoint: String,
@@ -230,10 +237,10 @@ impl<'a, T: ?Sized + Send + Sync + 'static> CompositionContext<'a, T> {
         if self.stack.contains(&entrypoint) {
             return Err(CompositionError::Recursion(self.stack.clone()).into());
         }
-        Ok(self
-            .composition
-            .build_internal(self.stack.clone(), entrypoint)
-            .await?)
+        match self.composition {
+            Some(comp) => Ok(comp.build_internal(self.stack.clone(), entrypoint).await?),
+            None => Err(CompositionError::NotFound(entrypoint).into()),
+        }
     }
 }
 
@@ -340,7 +347,7 @@ impl<T: ?Sized + Send + Sync + 'static> Composition<T> {
                     (async move {
                         let mut new_context = CompositionContext {
                             stack: stack.clone(),
-                            composition: self,
+                            composition: Some(self),
                         };
                         new_context.stack.push(entrypoint.clone());
                         let res = config