daemonize_me/
group.rs

1pub use std::convert::TryFrom;
2
3use crate::{DaemonError, Result};
4use crate::ffi::GroupRecord;
5
6/// Expects: either the group name or a gid
7/// if the name is provided it will be resolved to an id
8#[derive(Debug, Ord, PartialOrd, PartialEq, Eq, Clone)]
9pub struct Group {
10    pub id: u32,
11    pub name: String
12}
13
14impl<'uname> TryFrom<&'uname str> for Group {
15    type Error = DaemonError;
16
17    fn try_from(gname: &'uname str) -> Result<Group> {
18        match GroupRecord::lookup_record_by_name(gname) {
19            Ok(record) => Ok(Group {
20                id: record.gr_gid,
21                name: record.gr_name
22            }),
23            Err(_) => Err(DaemonError::InvalidGroup),
24        }
25    }
26}
27
28impl TryFrom<&String> for Group {
29    type Error = DaemonError;
30
31    fn try_from(gname: &String) -> Result<Group> {
32        match GroupRecord::lookup_record_by_name(gname.as_str()) {
33            Ok(record) => Ok(Group {
34                id: record.gr_gid,
35                name: record.gr_name
36            }),
37            Err(_) => Err(DaemonError::InvalidGroup),
38        }
39    }
40}
41
42impl TryFrom<u32> for Group {
43    type Error = DaemonError;
44
45    fn try_from(gid: u32) -> Result<Group> {
46        let record = GroupRecord::lookup_record_by_id(gid)?;
47        Ok(Group {
48            id: record.gr_gid,
49            name: record.gr_name
50        })
51    }
52}
53