Skip to content

Commit d06cba8

Browse files
committed
ref(target): replace sdkroots with platform
1 parent 5052874 commit d06cba8

File tree

4 files changed

+105
-4
lines changed

4 files changed

+105
-4
lines changed

Cargo.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ enum-as-inner = "0.5.0"
2727
derive_is_enum_variant = "0.1.1"
2828
enum_variant_macros = "0.2.0"
2929
phf = "0.10.1"
30+
serde = { version = "1.0.137", features = ["derive"] }
3031

3132
[dev-dependencies]
3233
tracing-test = "0.2.1"

src/pbxproj/mod.rs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,11 +148,16 @@ fn test_demo1_representation() {
148148
assert_eq!(Some(&String::from("Wordle")), targets[0].product_name);
149149
assert_eq!(Some(&String::from("Wordle")), targets[0].name);
150150
assert_eq!(PBXProductType::Application, targets[0].product_type);
151+
assert_eq!(
152+
PBXTargetPlatform::IOS,
153+
targets[0].platfrom(project.objects())
154+
);
151155
assert_eq!(None, targets[0].build_tool_path);
152156
assert_eq!(None, targets[0].build_arguments_string);
153157
assert_eq!(None, targets[0].build_working_directory);
154158
assert_eq!(None, targets[0].pass_build_settings_in_environment);
155159
assert_eq!(3, targets[0].build_phases.len());
160+
156161
assert_eq!(
157162
vec![
158163
(&PBXBuildPhaseKind::Sources, 12), // 12
@@ -188,8 +193,11 @@ fn test_demo10_representation() {
188193
assert_eq!(&PBXTargetKind::Native, targets[0].kind);
189194
assert_eq!(Some(&String::from("Scrumdinger")), targets[0].product_name);
190195
assert_eq!(Some(&String::from("Scrumdinger")), targets[0].name);
191-
assert!(!targets[0].sdkroots(project.objects()).is_empty());
192196
assert_eq!(PBXProductType::Application, targets[0].product_type);
197+
assert_eq!(
198+
PBXTargetPlatform::IOS,
199+
targets[0].platfrom(project.objects())
200+
);
193201
assert_eq!(None, targets[0].build_tool_path);
194202
assert_eq!(None, targets[0].build_arguments_string);
195203
assert_eq!(None, targets[0].build_working_directory);

src/pbxproj/object/target.rs

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
mod dependency;
2+
mod platform;
23
pub use dependency::*;
34

45
use anyhow::Result;
56

67
use crate::pbxproj::*;
78

9+
pub use platform::PBXTargetPlatform;
10+
811
/// `Abstraction` for building a specific targets (a library, binary, or test).
912
///
1013
/// variants: `PBXAggregateTarget`, `PBXLegacyTarget`, and `PBXNativeTarget`
@@ -46,7 +49,7 @@ pub struct PBXTarget<'a> {
4649

4750
impl<'a> PBXTarget<'a> {
4851
/// get target's sdk roots from all build configuration settings
49-
pub fn sdkroots(&'a self, objects: &'a PBXObjectCollection) -> Vec<&'a String> {
52+
pub fn platfrom(&'a self, objects: &'a PBXObjectCollection) -> PBXTargetPlatform {
5053
if let Some(ref bclist) = self.build_configuration_list {
5154
let mut sdkroots = bclist
5255
.build_configurations
@@ -68,9 +71,18 @@ impl<'a> PBXTarget<'a> {
6871
if sdkroots.is_empty() {
6972
tracing::error!("No SDKROOT found for {:?}", self.name);
7073
}
71-
sdkroots
74+
sdkroots.dedup();
75+
let sdkroot = &sdkroots[0];
76+
if sdkroots.len() > 1 {
77+
tracing::warn!("Get more then one sdkroot for target {:?}", self.name);
78+
tracing::warn!("Using {sdkroot:?} as sdkroot");
79+
}
80+
PBXTargetPlatform::from_sdk_root(sdkroot.as_str())
7281
} else {
73-
tracing::error!("No build configuration list for {:?}", self.name);
82+
tracing::error!(
83+
"No build configuration list for {:?}, platfrom is not identified",
84+
self.name
85+
);
7486
Default::default()
7587
}
7688
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
use serde::{Deserialize, Serialize};
2+
use std::str::FromStr;
3+
4+
use derive_is_enum_variant::is_enum_variant;
5+
#[derive(Clone, Debug, Deserialize, Serialize, Hash, PartialEq, Eq, is_enum_variant)]
6+
/// Target Platform based
7+
pub enum PBXTargetPlatform {
8+
/// iOS Platform
9+
#[serde(rename = "iOS")]
10+
IOS,
11+
/// watchOS Platform
12+
#[serde(rename = "watchOS")]
13+
WatchOS,
14+
/// tvOs Platform
15+
#[serde(rename = "tvOS")]
16+
TvOS,
17+
/// macOS Platform
18+
#[serde(rename = "macOS")]
19+
MacOS,
20+
/// Unknown or not support platform
21+
Unknown,
22+
}
23+
24+
impl Default for PBXTargetPlatform {
25+
fn default() -> Self {
26+
Self::Unknown
27+
}
28+
}
29+
30+
impl PBXTargetPlatform {
31+
/// Get Target Platfrom from sdkroot
32+
pub fn from_sdk_root(sdk_root: &str) -> Self {
33+
match sdk_root {
34+
"iphoneos" => Self::IOS,
35+
"macosx" => Self::MacOS,
36+
"appletvos" => Self::TvOS,
37+
"watchos" => Self::WatchOS,
38+
_ => Self::Unknown,
39+
}
40+
}
41+
/// Get PBXTargetPlatform from simulator identifer
42+
pub fn from_identifer(identifer: &str) -> Self {
43+
let name = identifer.replace("com.apple.CoreSimulator.SimRuntime.", "");
44+
let platform_str = name.split("-").next().unwrap().to_string();
45+
match Self::from_str(&platform_str) {
46+
Ok(res) => res,
47+
Err(e) => {
48+
tracing::error!("Platfrom from str: {e}");
49+
Self::Unknown
50+
}
51+
}
52+
}
53+
}
54+
55+
impl FromStr for PBXTargetPlatform {
56+
type Err = String;
57+
58+
fn from_str(s: &str) -> std::result::Result<Self, String> {
59+
match s {
60+
"iOS" => Ok(Self::IOS),
61+
"watchOS" => Ok(Self::WatchOS),
62+
"tvOS" => Ok(Self::TvOS),
63+
"macOS" => Ok(Self::MacOS),
64+
_ => Ok(Self::Unknown),
65+
}
66+
}
67+
}
68+
69+
impl ToString for PBXTargetPlatform {
70+
fn to_string(&self) -> String {
71+
match self {
72+
Self::IOS => "iOS",
73+
Self::WatchOS => "watchOS",
74+
Self::TvOS => "tvOS",
75+
Self::MacOS => "macOS",
76+
_ => "",
77+
}
78+
.into()
79+
}
80+
}

0 commit comments

Comments
 (0)