Skip to content

Commit 23e5103

Browse files
committed
ref(pbxproj): move some query logic to collection
1 parent 53813b7 commit 23e5103

File tree

2 files changed

+71
-74
lines changed

2 files changed

+71
-74
lines changed

src/pbxproj/object/collection.rs

Lines changed: 61 additions & 48 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
use super::PBXObject;
2-
use std::{cell::RefCell, collections::HashMap, rc::Weak};
1+
use super::{PBXObject, PBXTarget, XCRemoteSwiftPackageReference};
2+
use std::{
3+
cell::RefCell,
4+
collections::HashMap,
5+
rc::{Rc, Weak},
6+
};
37

48
/// An alias for weak reference of [`PBXObjectCollection`]
59
pub type WeakPBXObjectCollection = Weak<RefCell<PBXObjectCollection>>;
@@ -8,62 +12,71 @@ pub type WeakPBXObjectCollection = Weak<RefCell<PBXObjectCollection>>;
812
#[derive(Default, Debug, derive_new::new, derive_deref_rs::Deref)]
913
pub struct PBXObjectCollection(pub(crate) HashMap<String, PBXObject>);
1014

15+
/// TODO: make collections a HashSet of PBXObject with identifier included?
1116
impl PBXObjectCollection {
17+
pub(crate) fn set_inner(&mut self, map: HashMap<String, PBXObject>) {
18+
self.0 = map;
19+
}
20+
1221
/// Add new object. same as insert but it auto create id and returns it
1322
pub fn push<O: Into<PBXObject>>(&mut self, object: O) -> String {
1423
let id = uuid::Uuid::new_v4().to_string();
1524
self.insert(id.clone(), object.into());
1625
id
1726
}
1827

19-
pub(crate) fn set_inner(&mut self, map: HashMap<String, PBXObject>) {
20-
self.0 = map;
28+
/// Get PBXTarget by reference
29+
pub fn get_target<'a>(&'a self, reference: &str) -> Option<Rc<RefCell<PBXTarget>>> {
30+
self.get(reference)?.as_pbx_target().map(|r| r.clone())
2131
}
2232

23-
// /// Get PBXTarget by the target name
24-
// pub fn get_target_by_name<'a>(
25-
// &'a self,
26-
// target_name: &'a str,
27-
// ) -> Option<(&'a String, Ref<'a, PBXObject>)> {
28-
// self.0
29-
// .iter()
30-
// .find(|(_, &o)| {
31-
// let target = match *o.borrow() {
32-
// PBXObject::PBXAggregateTarget(ref v) => &v.inner,
33-
// PBXObject::PBXLegacyTarget(ref v) => &v.inner,
34-
// PBXObject::PBXNativeTarget(ref v) => &v.inner,
35-
// _ => return false,
36-
// };
37-
// if let Some(name) = target.name.as_ref() {
38-
// name == target_name
39-
// } else {
40-
// false
41-
// }
42-
// })
43-
// .map(|(key, o)| (key, o.borrow()))
44-
// }
33+
/// Get XCRemoteSwiftPackageReference from a vec of references
34+
pub fn get_packages_from_references<'a>(
35+
&'a self,
36+
references: &Vec<String>,
37+
) -> Vec<(String, Rc<RefCell<XCRemoteSwiftPackageReference>>)> {
38+
references
39+
.iter()
40+
.map(|id| {
41+
let package = self.get(id)?.as_xc_remote_swift_package_reference()?;
42+
Some((id.clone(), package.clone()))
43+
})
44+
.flatten()
45+
.collect()
46+
}
4547

46-
// /// Get PBXTarget by reference
47-
// pub fn get_target(&self, reference: &str) -> Option<&PBXObject> {
48-
// if let Some(object) = self.get(reference) {
49-
// if object.borrow().is_pbx_target() {
50-
// return Some(Rc::downgrade(object));
51-
// }
52-
// None
53-
// } else {
54-
// None
55-
// }
56-
// }
48+
/// Get PBXTarget from a vec of references
49+
pub fn get_targets_from_references<'a>(
50+
&'a self,
51+
references: &Vec<String>,
52+
) -> Vec<(String, Rc<RefCell<PBXTarget>>)> {
53+
references
54+
.iter()
55+
.map(|id| {
56+
let target = self.get_target(id)?;
57+
Some((id.clone(), target.clone()))
58+
})
59+
.flatten()
60+
.collect()
61+
}
5762

58-
// /// Get mutable PBXTarget by reference
59-
// pub fn get_target_mut(&mut self, reference: &str) -> Option<&mut PBXObject> {
60-
// if let Some(object) = self.get_mut(reference) {
61-
// if object.is_pbx_target() {
62-
// return Some(object);
63-
// }
64-
// None
65-
// } else {
66-
// None
67-
// }
68-
// }
63+
/// Get PBXTarget by the target name
64+
pub fn get_target_by_name<'a>(
65+
&'a self,
66+
target_name: &'a str,
67+
) -> Option<(String, Rc<RefCell<PBXTarget>>)> {
68+
self.iter()
69+
.find(|(_, o)| {
70+
if let Some(target) = o.as_pbx_target() {
71+
if let Some(name) = target.borrow().name.as_ref() {
72+
name == target_name
73+
} else {
74+
false
75+
}
76+
} else {
77+
false
78+
}
79+
})
80+
.map(|(key, o)| (key.clone(), o.as_pbx_target().unwrap().clone()))
81+
}
6982
}

src/pbxproj/object/project.rs

Lines changed: 10 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -46,41 +46,25 @@ pub struct PBXProject {
4646
impl PBXProject {
4747
/// Get packages that the project uses
4848
#[must_use]
49-
pub fn packages<'a>(&self) -> Option<Vec<Rc<RefCell<XCRemoteSwiftPackageReference>>>> {
49+
pub fn packages<'a>(
50+
&self,
51+
) -> Option<Vec<(String, Rc<RefCell<XCRemoteSwiftPackageReference>>)>> {
5052
let package_references = self.package_references.as_ref()?;
5153
let objects = self.objects.upgrade()?;
5254
let objects = objects.borrow();
53-
let mut packages = vec![];
54-
55-
for id in package_references.iter() {
56-
if let Some(object) = objects
57-
.get(id)
58-
.map(|o| o.as_xc_remote_swift_package_reference())
59-
.flatten()
60-
{
61-
packages.push(object.clone())
62-
}
63-
}
64-
65-
Some(packages)
55+
Some(objects.get_packages_from_references(package_references))
6656
}
6757

6858
/// Get targets for given reference
6959
#[must_use]
70-
pub fn targets(&self) -> Vec<Rc<RefCell<PBXTarget>>> {
71-
let objects = if let Some(objects) = self.objects.upgrade() {
72-
objects
60+
pub fn targets(&self) -> Vec<(String, Rc<RefCell<PBXTarget>>)> {
61+
let target_references = self.target_references;
62+
if let Some(objects) = self.objects.upgrade() {
63+
let objects = objects.borrow();
64+
objects.get_targets_from_references(&target_references)
7365
} else {
74-
return vec![];
75-
};
76-
let objects = objects.borrow();
77-
let mut targets = vec![];
78-
for id in self.target_references.iter() {
79-
if let Some(traget) = objects.get(id).map(|v| v.as_pbx_target()).flatten() {
80-
targets.push(traget.clone())
81-
}
66+
vec![]
8267
}
83-
targets
8468
}
8569

8670
/// Returns the attributes of a given target.

0 commit comments

Comments
 (0)