crossbundle_tools/types/android/
version_code.rs1use crate::error::{AndroidError, Result};
2
3#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq)]
4pub struct VersionCode {
5 major: u8,
6 minor: u8,
7 patch: u8,
8}
9
10impl VersionCode {
11 pub fn new(major: u8, minor: u8, patch: u8) -> Self {
12 Self {
13 major,
14 minor,
15 patch,
16 }
17 }
18
19 pub fn from_semver(version: &str) -> Result<Self> {
20 let mut iter = version.split(|c1| ['.', '-', '+'].iter().any(|c2| c1 == *c2));
21 let mut p = || {
22 iter.next()
23 .ok_or(AndroidError::InvalidSemver)?
24 .parse()
25 .map_err(|_| AndroidError::InvalidSemver)
26 };
27 Ok(Self::new(p()?, p()?, p()?))
28 }
29
30 pub fn to_code(&self, apk_id: u8) -> u32 {
31 (apk_id as u32) << 24
32 | (self.major as u32) << 16
33 | (self.minor as u32) << 8
34 | self.patch as u32
35 }
36}