crossbundle_tools/types/android/
version_code.rs

1use 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}