diff options
author | Yureka <tvl@yuka.dev> | 2024-07-18T15·27+0200 |
---|---|---|
committer | yuka <tvl@yuka.dev> | 2024-07-18T18·47+0000 |
commit | b8415a94d990fa99dcc9ae40112cae76fef83be1 (patch) | |
tree | 812ac07756476c3446242d1aa63c275ae26eb06a | |
parent | 1a6b6e3ef310c8eea37b55f8007c85a8772ff8e9 (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
-rw-r--r-- | tvix/castore/src/composition.rs | 19 |
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 |