use std::str::FromStr;
pub use self::channel::Channel;
use self::error::Result;
pub use self::error::VersionError;
pub use self::milestone::Milestone;
pub use self::revision::Revision;
pub use self::version::Version;
use crate::render::chrome_fetcher::{BrowserHost, BrowserKind, BuildInfo, Platform};
mod channel;
mod error;
mod metadata;
mod milestone;
mod revision;
#[allow(clippy::module_inception)]
mod version;
#[derive(Clone, Copy, Debug)]
pub enum BrowserVersion {
Channel(Channel),
Revision(Revision),
Version(Version),
Milestone(Milestone),
}
impl BrowserVersion {
#[doc(hidden)] pub fn current(kind: BrowserKind) -> Self {
match kind {
BrowserKind::Chromium => Self::Revision(Revision::new(1585606)),
BrowserKind::Chrome => Self::Channel(Channel::Stable),
BrowserKind::ChromeHeadlessShell => Self::Channel(Channel::Stable),
}
}
pub(crate) async fn resolve(
&self,
kind: BrowserKind,
platform: Platform,
host: &BrowserHost,
) -> Result<BuildInfo> {
match self {
Self::Revision(revision) => revision.resolve(kind, host).await,
Self::Channel(channel) => channel.resolve(kind, platform, host).await,
Self::Version(build) => build.resolve(kind, host).await,
Self::Milestone(milestone) => milestone.resolve(kind, host).await,
}
}
}
impl FromStr for BrowserVersion {
type Err = VersionError;
fn from_str(s: &str) -> Result<Self, Self::Err> {
if let Ok(revision) = s.parse::<Revision>() {
return Ok(Self::Revision(revision));
}
if let Ok(channel) = s.parse::<Channel>() {
return Ok(Self::Channel(channel));
}
if let Ok(build) = s.parse::<Version>() {
return Ok(Self::Version(build));
}
if let Ok(milestone) = s.parse::<Milestone>() {
return Ok(Self::Milestone(milestone));
}
Err(VersionError::InvalidVersion(s.to_string()))
}
}
impl TryFrom<String> for BrowserVersion {
type Error = VersionError;
fn try_from(value: String) -> Result<Self, Self::Error> {
Self::from_str(&value)
}
}
impl From<Channel> for BrowserVersion {
fn from(channel: Channel) -> Self {
Self::Channel(channel)
}
}
impl From<Revision> for BrowserVersion {
fn from(revision: Revision) -> Self {
Self::Revision(revision)
}
}
impl From<Version> for BrowserVersion {
fn from(build: Version) -> Self {
Self::Version(build)
}
}
impl From<Milestone> for BrowserVersion {
fn from(milestone: Milestone) -> Self {
Self::Milestone(milestone)
}
}