about summary refs log tree commit diff
path: root/tvix/store/src/nar/non_caching_calculation_service.rs
use count_write::CountWrite;
use sha2::{Digest, Sha256};

use crate::blobservice::BlobService;
use crate::chunkservice::ChunkService;
use crate::directoryservice::DirectoryService;
use crate::proto;

use super::renderer::NARRenderer;
use super::{NARCalculationService, RenderError};

/// A NAR calculation service which simply renders the whole NAR whenever
/// we ask for the calculation.
#[derive(Clone)]
pub struct NonCachingNARCalculationService<
    BS: BlobService,
    CS: ChunkService + Clone,
    DS: DirectoryService,
> {
    nar_renderer: NARRenderer<BS, CS, DS>,
}

impl<BS: BlobService, CS: ChunkService + Clone, DS: DirectoryService>
    NonCachingNARCalculationService<BS, CS, DS>
{
    pub fn new(blob_service: BS, chunk_service: CS, directory_service: DS) -> Self {
        Self {
            nar_renderer: NARRenderer::new(blob_service, chunk_service, directory_service),
        }
    }
}

impl<BS: BlobService, CS: ChunkService + Clone, DS: DirectoryService> NARCalculationService
    for NonCachingNARCalculationService<BS, CS, DS>
{
    fn calculate_nar(
        &self,
        root_node: &proto::node::Node,
    ) -> Result<proto::CalculateNarResponse, RenderError> {
        let h = Sha256::new();
        let mut cw = CountWrite::from(h);

        self.nar_renderer.write_nar(&mut cw, root_node)?;

        Ok(proto::CalculateNarResponse {
            nar_size: cw.count() as u32,
            nar_sha256: cw.into_inner().finalize().to_vec(),
        })
    }
}