1use auto_impl::auto_impl;
2use snix_castore::B3Digest;
3use snix_castore::Node;
4use snix_castore::directoryservice::OrderingError;
5use tonic::async_trait;
6
7mod hashing_reader;
8mod import;
9mod renderer;
10pub mod seekable;
11pub use import::{NarIngestionError, ingest_nar, ingest_nar_and_hash};
12pub use renderer::SimpleRenderer;
13pub use renderer::calculate_size_and_sha256;
14pub use renderer::write_nar;
15
16use crate::pathinfoservice;
17
18#[async_trait]
19#[auto_impl(&, &mut, Arc, Box)]
20pub trait NarCalculationService: Send + Sync {
21 async fn calculate_nar(
24 &self,
25 root_node: &Node,
26 ) -> Result<(u64, [u8; 32]), pathinfoservice::Error>;
27}
28
29#[derive(Debug, thiserror::Error)]
31pub enum RenderError {
32 #[error("failure talking to a backing directory service")]
33 DirectoryService(#[source] snix_castore::directoryservice::Error),
34
35 #[error("failure talking to a backing blob service")]
36 BlobService(#[source] std::io::Error),
37
38 #[error("unable to find directory {0}, referred from {1:?}")]
39 DirectoryNotFound(B3Digest, bytes::Bytes),
40
41 #[error("Invalid Ordering")]
42 OrderingError(#[source] OrderingError),
43
44 #[error("unable to find blob {0}, referred from {1:?}")]
45 BlobNotFound(B3Digest, bytes::Bytes),
46
47 #[error(
48 "unexpected size in metadata for blob {0}, referred from {1:?} returned, expected {2}, got {3}"
49 )]
50 UnexpectedBlobMeta(B3Digest, bytes::Bytes, u32, u32),
51
52 #[error("failure using the NAR writer: {0}")]
53 NARWriterError(std::io::Error),
54}