From b8415a94d990fa99dcc9ae40112cae76fef83be1 Mon Sep 17 00:00:00 2001 From: Yureka Date: Thu, 18 Jul 2024 17:27:08 +0200 Subject: [PATCH] feat(tvix/composition): allow creating a blank CompositionContext 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 Autosubmit: yuka Tested-by: BuildkiteCI --- tvix/castore/src/composition.rs | 19 +++++++++++++------ 1 file changed, 13 insertions(+), 6 deletions(-) diff --git a/tvix/castore/src/composition.rs b/tvix/castore/src/composition.rs index 88cedcb83..cd4064af9 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, - composition: &'a Composition, + composition: Option<&'a Composition>, } 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 Composition { (async move { let mut new_context = CompositionContext { stack: stack.clone(), - composition: self, + composition: Some(self), }; new_context.stack.push(entrypoint.clone()); let res = config