use std::env;
use anyhow::Result;
use url::Url;
use crate::{byondversion::ByondVersion, errors, pagerdata};
const BYOND_DOWNLOAD_BASEURL: &str = "https://www.byond.com/download/build/";
const BYOND_DOWNLOAD_BASEURL_MIRROR: &str = "https://spacestation13.github.io/byond-builds/";
const BYOND_DOWNLOAD_FILENAME_SUFFIX_WINDOWS: &str = "_byond.zip";
const BYOND_DOWNLOAD_FILENAME_SUFFIX_LINUX: &str = "_byond_linux.zip";
pub fn construct_download_url(byond_version: &ByondVersion) -> Result<Url> {
let base_url = if crate::should_use_mirror() {
BYOND_DOWNLOAD_BASEURL_MIRROR
} else {
BYOND_DOWNLOAD_BASEURL
};
let url = Url::parse(base_url)?
.join(format!("{}/", byond_version.major).as_str())?
.join(format!("{}{}", byond_version, downloadurl_platform_suffix()?).as_str())?;
Ok(url)
}
fn downloadurl_platform_suffix() -> Result<String, errors::UnsupportedOSError> {
let platform_suffix = match env::consts::OS {
"linux" => BYOND_DOWNLOAD_FILENAME_SUFFIX_LINUX,
"windows" => BYOND_DOWNLOAD_FILENAME_SUFFIX_WINDOWS,
_ => return Err(errors::UnsupportedOSError),
};
Ok(platform_suffix.to_owned())
}
pub fn userstring_to_byond_version(version_string: &String) -> Result<ByondVersion> {
let parsed_version = match version_string.as_str() {
"latest" | "current" | "stable" => pagerdata::latest_version(false)?,
"beta" => pagerdata::latest_version(true)?,
versionstring => versionstring.parse::<ByondVersion>()?,
};
log::debug!(
"Requested version '{}' resolves to BYOND version '{}'",
version_string,
parsed_version
);
Ok(parsed_version)
}
#[cfg(test)]
mod tests {
use super::*;
const TEST_BYONDVERSION_STRUCT: ByondVersion = ByondVersion {
major: 515,
build: 1630,
};
#[test]
fn test_construct_url() {
assert!(construct_download_url(&TEST_BYONDVERSION_STRUCT).is_ok())
}
}