daemonize_me/
user.rs

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