Add integration for libnixstore

This adds a conditional feature flag for loading data from libnixstore
exposed behind a feature flag dependency
This commit is contained in:
bad 2022-08-19 23:33:27 +02:00
parent 6bed1a222e
commit 459ed33bdd
4 changed files with 49 additions and 2 deletions

View file

@ -7,5 +7,12 @@ repository = "https://im.badat.dev/bad/narinfo-rs"
license = "MIT OR Apache-2.0" license = "MIT OR Apache-2.0"
keywords = ["nix", "nixos"] keywords = ["nix", "nixos"]
[features]
libnixstore = ["dep:libnixstore"]
[dependencies] [dependencies]
derive_builder = { version = "0.11.2", default-features = false } derive_builder = { version = "0.11.2", default-features = false }
libnixstore = { version = "0.2.0", optional = true }
[package.metadata.docs.rs]
all-features = true

10
shell.nix Normal file
View file

@ -0,0 +1,10 @@
with import <nixpkgs> { };
mkShell {
nativeBuildInputs = [
nix
nlohmann_json
libsodium
boost
pkg-config
];
}

View file

@ -6,10 +6,13 @@ extern crate alloc;
pub mod error; pub mod error;
mod narinfo; pub mod narinfo;
mod nix_cache_info; pub mod nix_cache_info;
mod sig; mod sig;
#[cfg(feature = "libnixstore")]
mod libnixstore;
pub use crate::narinfo::NarInfo; pub use crate::narinfo::NarInfo;
pub use nix_cache_info::NixCacheInfo; pub use nix_cache_info::NixCacheInfo;
pub use sig::Sig; pub use sig::Sig;

27
src/libnixstore.rs Normal file
View file

@ -0,0 +1,27 @@
use crate::narinfo::NarInfoBuilder;
use crate::Sig;
use alloc::borrow::Cow;
impl<'a> NarInfoBuilder<'a> {
/// Read and set the store dir from [`libnixstore`].
///
/// This function assumes that [`libnixstore::init`] has already been called
pub fn store_dir_from_libnixstore(&mut self) -> &Self {
let store_dir = libnixstore::get_store_dir();
self.store_path(Cow::Owned(store_dir));
self
}
/// Read and set `path`, `references` and `sigs` from a [`libnixstore::PathInfo`]
pub fn attr_from_libnixstore_path(&mut self, path: &'a libnixstore::PathInfo) -> &Self {
self.file_size(Some(path.size));
self.references(path.refs.iter().map(Cow::from).collect());
self.sigs(
path.sigs
.iter()
.map(|v| Sig::parse(v).expect("libnixstore provided signature should be in a valid format"))
.collect());
self
}
}