#[cfg(feature = "async")]
pub mod async_reader;
#[cfg(feature = "sync")]
pub mod sync_reader;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct PasswdEntry {
pub username: String,
pub passwd: String,
pub uid: u32,
pub gid: u32,
pub gecos: String,
pub home_dir: String,
pub shell: String,
}
impl PasswdEntry {
pub fn parse(s: &str) -> Option<PasswdEntry> {
let mut entries = s.splitn(7, ':');
Some(PasswdEntry {
username: match entries.next() {
None => return None,
Some(s) => s.to_string(),
},
passwd: match entries.next() {
None => return None,
Some(s) => s.to_string(),
},
uid: match entries.next().and_then(|s| s.parse().ok()) {
None => return None,
Some(s) => s,
},
gid: match entries.next().and_then(|s| s.parse().ok()) {
None => return None,
Some(s) => s,
},
gecos: match entries.next() {
None => return None,
Some(s) => s.to_string(),
},
home_dir: match entries.next() {
None => return None,
Some(s) => s.to_string(),
},
shell: match entries.next() {
None => return None,
Some(s) => s.to_string(),
},
})
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct GroupEntry {
pub name: String,
pub passwd: String,
pub gid: u32,
pub users: Vec<String>,
}
impl GroupEntry {
pub fn parse(s: &str) -> Option<GroupEntry> {
let mut entries = s.splitn(4, ':');
Some(GroupEntry {
name: match entries.next() {
None => return None,
Some(s) => s.to_string(),
},
passwd: match entries.next() {
None => return None,
Some(s) => s.to_string(),
},
gid: match entries.next().and_then(|s| s.parse().ok()) {
None => return None,
Some(s) => s,
},
users: match entries.next() {
None => return None,
Some(s) => s.split(',').map(|p| p.to_string()).collect(),
},
})
}
}