cargo-aprz-lib 0.14.0

Internal library for cargo-aprz
Documentation
use super::{CrateId, VersionId, define_rows, define_table};
use crate::Result;
use ohno::bail;
use serde::Deserialize;

define_rows! {
    DependencyRow {
        pub version_id: VersionId,
        pub crate_id: CrateId,

        #[cfg(all_fields)]
        pub features: Vec<&'a str>,
        #[cfg(all_fields)]
        pub id: super::DependencyId,
        #[cfg(all_fields)]
        kind: u64,
        #[cfg(all_fields)]
        pub default_features: bool,
        #[cfg(all_fields)]
        pub explicit_name: &'a str,
        #[cfg(all_fields)]
        pub optional: bool,
        #[cfg(all_fields)]
        pub req: &'a str,
        #[cfg(all_fields)]
        pub target: &'a str,
    }
}

#[cfg(all_fields)]
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DependencyKind {
    Normal,
    Build,
    Dev,
}

impl DependencyRow {
    #[cfg(all_fields)]
    pub fn kind(&self) -> DependencyKind {
        match self.kind {
            0 => DependencyKind::Normal,
            1 => DependencyKind::Build,
            2 => DependencyKind::Dev,
            _ => unreachable!("invalid dependency kind: {}", self.kind),
        }
    }
}

define_table! {
    dependencies {
        fn write_row(csv_row: &CsvDependencyRow<'a>, writer: &mut RowWriter<impl Write>) -> Result<()> {
            writer.write_str_as_u64(csv_row.version_id)?;
            writer.write_str_as_u64(csv_row.crate_id)?;

            #[cfg(all_fields)]
            {
                writer.write_pg_array_as_str_vec(csv_row.features)?;

                if csv_row.kind != "0" && csv_row.kind != "1" && csv_row.kind != "2" {
                    bail!("invalid dependency kind: {}", csv_row.kind);
                }

                writer.write_str_as_u64(csv_row.id)?;
                writer.write_str_as_u64(csv_row.kind)?;
                writer.write_str_as_bool(csv_row.default_features)?;
                writer.write_str(csv_row.explicit_name);
                writer.write_str_as_bool(csv_row.optional)?;
                writer.write_str(csv_row.req);
                writer.write_str(csv_row.target);
            }

            Ok(())
        }

        fn read_row<'a>(reader: &mut RowReader<'a>) -> DependencyRow {
            DependencyRow {
                version_id: VersionId(reader.read_u64()),
                crate_id: CrateId(reader.read_u64()),

                #[cfg(all_fields)]
                features: reader.read_str_vec(),

                #[cfg(all_fields)]
                id: super::DependencyId(reader.read_u64()),

                #[cfg(all_fields)]
                kind: reader.read_u64(),

                #[cfg(all_fields)]
                default_features: reader.read_bool(),

                #[cfg(all_fields)]
                explicit_name: reader.read_str(),

                #[cfg(all_fields)]
                optional: reader.read_bool(),

                #[cfg(all_fields)]
                req: reader.read_str(),

                #[cfg(all_fields)]
                target: reader.read_str(),
            }
        }
    }
}