diff --git a/vm/src/stdlib/pwd.rs b/vm/src/stdlib/pwd.rs index 77356260b..644c42279 100644 --- a/vm/src/stdlib/pwd.rs +++ b/vm/src/stdlib/pwd.rs @@ -53,39 +53,39 @@ mod pwd { #[pyfunction] fn getpwnam(name: PyStrRef, vm: &VirtualMachine) -> PyResult { - if name.as_str().contains('\0') { + let pw_name = name.as_str(); + if pw_name.contains('\0') { return Err(exceptions::cstring_error(vm)); } - match User::from_name(name.as_str()).map_err(|err| err.into_pyexception(vm))? { - Some(user) => Ok(Passwd::from(user)), - None => { - let name_repr = name.as_object().repr(vm)?; - let message = vm - .ctx - .new_str(format!("getpwnam(): name not found: {}", name_repr)) - .into(); - Err(vm.new_key_error(message)) - } - } + let user = User::from_name(name.as_str()).map_err(|err| err.into_pyexception(vm))?; + let user = user.ok_or_else(|| { + vm.new_key_error( + vm.ctx + .new_str(format!("getpwnam(): name not found: {}", pw_name)) + .into(), + ) + })?; + Ok(Passwd::from(user)) } #[pyfunction] fn getpwuid(uid: PyIntRef, vm: &VirtualMachine) -> PyResult { - let uid_t = libc::uid_t::try_from(uid.as_bigint()).map(unistd::Uid::from_raw); - let user = match uid_t { - Ok(uid) => User::from_uid(uid).map_err(|err| err.into_pyexception(vm))?, - Err(_) => None, - }; - match user { - Some(user) => Ok(Passwd::from(user)), - None => { - let message = vm - .ctx + let uid_t = libc::uid_t::try_from(uid.as_bigint()) + .map(unistd::Uid::from_raw) + .ok(); + let user = uid_t + .map(User::from_uid) + .transpose() + .map_err(|err| err.into_pyexception(vm))? + .flatten(); + let user = user.ok_or_else(|| { + vm.new_key_error( + vm.ctx .new_str(format!("getpwuid(): uid not found: {}", uid.as_bigint())) - .into(); - Err(vm.new_key_error(message)) - } - } + .into(), + ) + })?; + Ok(Passwd::from(user)) } // TODO: maybe merge this functionality into nix?