use cargo::util::GlobalContext;
use cargo::{CargoResult, core::SourceId, util::IntoUrl};
use url::Url;
#[derive(Debug, Default)]
pub struct ClonerSource {
pub(crate) cargo_source: CargoSource,
}
#[derive(Debug, Default)]
pub(crate) enum CargoSource {
#[default]
CratesIo,
Index(Url),
LocalRegistry(String),
Registry(String),
}
impl ClonerSource {
pub fn registry(key: impl Into<String>) -> Self {
Self {
cargo_source: CargoSource::Registry(key.into()),
}
}
pub fn local_registry(path: impl Into<String>) -> Self {
Self {
cargo_source: CargoSource::LocalRegistry(path.into()),
}
}
pub fn index(index: impl AsRef<str>) -> CargoResult<Self> {
let index: &str = index.as_ref();
let cargo_source = CargoSource::Index(index.into_url()?);
Ok(Self { cargo_source })
}
pub fn index_from_url(url: Url) -> Self {
let cargo_source = CargoSource::Index(url);
Self { cargo_source }
}
pub fn crates_io() -> Self {
Self {
cargo_source: CargoSource::CratesIo,
}
}
}
impl CargoSource {
pub(crate) fn to_source_id(&self, context: &GlobalContext) -> CargoResult<SourceId> {
match self {
CargoSource::CratesIo => SourceId::crates_io(context),
CargoSource::Index(url) => SourceId::for_registry(url),
CargoSource::LocalRegistry(path) => {
SourceId::for_local_registry(&context.cwd().join(path))
}
CargoSource::Registry(key) => SourceId::alt_registry(context, key),
}
}
}