Skip to content

Commit c3cc42a

Browse files
committed
feat(pbxproj): get file by name or path
1 parent b85fbd0 commit c3cc42a

File tree

2 files changed

+52
-0
lines changed

2 files changed

+52
-0
lines changed

src/pbxproj/object/collection.rs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,24 @@ impl PBXObjectCollection {
8686
self.get_fs_references(|fs_reference| fs_reference.is_group())
8787
}
8888

89+
/// Get PBXGroup with by name or path
90+
pub fn get_group_by_name_or_path<'a, S: AsRef<str>>(
91+
&'a self,
92+
name_or_path: S,
93+
) -> Option<(String, Rc<RefCell<PBXFSReference>>)> {
94+
let name = name_or_path.as_ref();
95+
self.groups().into_iter().find(|(_, o)| {
96+
let group = o.borrow();
97+
if let Some(n) = group.name() {
98+
return n == name;
99+
} else if let Some(p) = group.path() {
100+
return p == name;
101+
} else {
102+
false
103+
}
104+
})
105+
}
106+
89107
/// Get all PBXProject
90108
pub fn projects<'a>(&'a self) -> Vec<(String, Rc<RefCell<PBXProject>>)> {
91109
self.iter()

src/pbxproj/object/fs/mod.rs

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -124,6 +124,27 @@ impl PBXFSReference {
124124
pub fn parent(&self) -> Option<Rc<RefCell<Self>>> {
125125
self.parent.upgrade()
126126
}
127+
128+
/// Get File from the group
129+
///
130+
/// NOTE: This will return None if self is file
131+
pub fn get_file<S: AsRef<str>>(&self, name: S) -> Option<Rc<RefCell<PBXFSReference>>> {
132+
let name = name.as_ref();
133+
self.children().into_iter().find(|o| {
134+
if !o.borrow().is_file() {
135+
return false;
136+
}
137+
let file = o.borrow();
138+
139+
if let Some(n) = file.name() {
140+
n == name
141+
} else if let Some(p) = file.path() {
142+
p == name
143+
} else {
144+
false
145+
}
146+
})
147+
}
127148
}
128149

129150
impl Eq for PBXFSReference {}
@@ -178,4 +199,17 @@ mod tests {
178199
main_group.children_references()
179200
)
180201
}
202+
#[test]
203+
fn get_file() {
204+
use crate::pbxproj::test_demo_file;
205+
let project = test_demo_file!(demo1);
206+
let source_group = project
207+
.objects()
208+
.get_group_by_name_or_path("Source")
209+
.unwrap()
210+
.1;
211+
let source_group = source_group.borrow();
212+
let file = source_group.get_file("Log.swift");
213+
assert!(file.is_some())
214+
}
181215
}

0 commit comments

Comments
 (0)