pub mod bougie_index_backend;
pub mod nodejs_org;
pub mod windows_php_net;
pub use bougie_index_backend::BougieIndexBackend;
pub use nodejs_org::{NodeRecipe, NodeRequest, NodeVersion, NodejsOrgBackend};
pub use windows_php_net::WindowsPhpNetBackend;
use bougie_fetch::{fetch_blob, ArchiveKind, BlobOutcome, DownloadBar};
use bougie_index::wire::LoadDirective;
use bougie_paths::Paths;
use bougie_version::request::{Flavor, VersionLike};
use bougie_resolver::ResolveOptions;
use bougie_platform::target::{Os, Triple};
use bougie_version::version::{PartialVersion, Version};
use eyre::Result;
use std::path::{Path, PathBuf};
pub trait Backend {
fn resolve_php(
&self,
spec: &VersionLike,
flavor: Flavor,
opts: ResolveOptions,
) -> Result<PhpRecipe>;
fn resolve_extension(
&self,
name: &str,
php_minor: PartialVersion,
flavor: Flavor,
version_pin: Option<&str>,
opts: ResolveOptions,
) -> Result<ExtRecipe>;
fn client(&self) -> &reqwest::blocking::Client;
fn fetch_into(
&self,
blob: &BlobRef,
install_root: &Path,
partial_dir: &Path,
bar: &DownloadBar,
) -> Result<BlobOutcome> {
let spec = blob.as_blob_spec(partial_dir, install_root);
fetch_blob(self.client(), &spec, bar)
}
}
pub fn select(target: &Triple, host: &str, paths: &Paths) -> Result<Box<dyn Backend>> {
if target.os == Os::Windows {
Ok(Box::new(WindowsPhpNetBackend::new(paths, target)?))
} else {
Ok(Box::new(BougieIndexBackend::new(
paths,
host,
&target.to_string(),
)?))
}
}
pub(crate) fn build_http_client(_label: &'static str) -> Result<reqwest::blocking::Client> {
bougie_fetch::default_client()
}
#[derive(Debug, Clone)]
pub struct BlobRef {
pub url: String,
pub sha256: String,
pub size: u64,
pub archive: ArchiveKind,
pub strip_prefix: String,
}
#[derive(Debug, Clone)]
pub struct PhpRecipe {
pub version: Version,
pub flavor: Flavor,
pub blob: BlobRef,
pub frozen_warning: bool,
}
impl BlobRef {
pub fn as_blob_spec<'a>(
&'a self,
partial_dir: &'a std::path::Path,
dest: &'a std::path::Path,
) -> bougie_fetch::BlobSpec<'a> {
bougie_fetch::BlobSpec {
url: &self.url,
hash: bougie_fetch::Hash::sha256(&self.sha256),
partial_dir,
dest,
strip_prefix: &self.strip_prefix,
archive: self.archive,
auth_header: None,
auth_header_name: None,
}
}
}
#[derive(Debug, Clone)]
pub struct ExtRecipe {
pub name: String,
pub version: Version,
pub php_minor: PartialVersion,
pub flavor: Flavor,
pub blob: BlobRef,
pub artifact_rel: PathBuf,
pub load: LoadDirective,
pub closure: Vec<ClosureRef>,
pub needs_store_on_path: bool,
pub frozen_warning: bool,
}
#[derive(Debug, Clone)]
pub struct ClosureRef {
pub name: String,
pub version: String,
pub hash: String,
pub sha256: String,
pub url: String,
pub size: u64,
}
impl From<&bougie_index::wire::Closure> for ClosureRef {
fn from(c: &bougie_index::wire::Closure) -> Self {
Self {
name: c.name.clone(),
version: c.version.clone(),
hash: c.hash.clone(),
sha256: c.sha256.clone(),
url: c.url.clone(),
size: c.size,
}
}
}