extern crate rand_old;
extern crate regex_generate;
use rand_old::{thread_rng, Rng};
use regex_generate::{Generator, DEFAULT_MAX_REPEAT};
use semver::{BuildMetadata, Prerelease};
pub const SEMVER_REGEX: &str = r"(?-u:(0|[1-9]\d*)\.(0|[1-9]\d*)\.(0|[1-9]\d*)(?:-((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*))?(?:\+([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*))?)";
pub const ALWAYS_PRERELEASE_REGEX: &str = r"(?-u:(?:((?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*)(?:\.(?:0|[1-9]\d*|\d*[a-zA-Z-][0-9a-zA-Z-]*))*)))";
pub const ALWAYS_BUILD_METADATA_REGEX: &str = r"(?-u:(?:([0-9a-zA-Z-]+(?:\.[0-9a-zA-Z-]+)*)))";
pub(crate) fn generate_any_valid_semver(count: usize) -> Vec<String> {
let mut semver = Generator::new(SEMVER_REGEX, thread_rng(), DEFAULT_MAX_REPEAT).unwrap();
let mut v = Vec::with_capacity(count);
for _i in 0..count {
let mut buffer = vec![];
semver.generate(&mut buffer).unwrap();
v.push(String::from_utf8(buffer).unwrap())
}
v
}
pub(crate) fn generate_u64_safe_semver(count: usize) -> Vec<String> {
let mut pre_release_gen =
Generator::new(ALWAYS_PRERELEASE_REGEX, thread_rng(), DEFAULT_MAX_REPEAT).unwrap();
let mut build_metadata_gen = Generator::new(
ALWAYS_BUILD_METADATA_REGEX,
thread_rng(),
DEFAULT_MAX_REPEAT,
)
.unwrap();
let mut v = Vec::with_capacity(count);
for _i in 0..count {
let pre: Option<Prerelease> = match thread_rng().gen_bool(0.5) {
true => {
let mut buffer = vec![];
pre_release_gen.generate(&mut buffer).unwrap();
Some(Prerelease::new(&String::from_utf8(buffer).unwrap()).unwrap())
}
false => None,
};
let build: Option<BuildMetadata> = match thread_rng().gen_bool(0.5) {
true => {
let mut buffer = vec![];
build_metadata_gen.generate(&mut buffer).unwrap();
Some(BuildMetadata::new(&String::from_utf8(buffer).unwrap()).unwrap())
}
false => None,
};
let mut s = format!(
"{}.{}.{}",
thread_rng().gen::<u64>(),
thread_rng().gen::<u64>(),
thread_rng().gen::<u64>()
);
if let Some(pre) = pre {
s = format!("{s}-{}", pre);
}
if let Some(build) = build {
s = format!("{s}+{}", build);
}
v.push(s)
}
v
}