| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111 |
- use ansi_term::Style;
- use users::{Users, Groups};
- use crate::fs::fields as f;
- use crate::output::cell::TextCell;
- impl f::Group {
- pub fn render<C: Colours, U: Users+Groups>(self, colours: &C, users: &U) -> TextCell {
- use users::os::unix::GroupExt;
- let mut style = colours.not_yours();
- let group = match users.get_group_by_gid(self.0) {
- Some(g) => (*g).clone(),
- None => return TextCell::paint(style, self.0.to_string()),
- };
- let current_uid = users.get_current_uid();
- if let Some(current_user) = users.get_user_by_uid(current_uid) {
- if current_user.primary_group_id() == group.gid()
- || group.members().iter().any(|u| u == current_user.name())
- {
- style = colours.yours();
- }
- }
- TextCell::paint(style, group.name().to_string_lossy().into())
- }
- }
- pub trait Colours {
- fn yours(&self) -> Style;
- fn not_yours(&self) -> Style;
- }
- #[cfg(test)]
- #[allow(unused_results)]
- pub mod test {
- use super::Colours;
- use crate::fs::fields as f;
- use crate::output::cell::TextCell;
- use users::{User, Group};
- use users::mock::MockUsers;
- use users::os::unix::GroupExt;
- use ansi_term::Colour::*;
- use ansi_term::Style;
- struct TestColours;
- impl Colours for TestColours {
- fn yours(&self) -> Style { Fixed(80).normal() }
- fn not_yours(&self) -> Style { Fixed(81).normal() }
- }
- #[test]
- fn named() {
- let mut users = MockUsers::with_current_uid(1000);
- users.add_group(Group::new(100, "folk"));
- let group = f::Group(100);
- let expected = TextCell::paint_str(Fixed(81).normal(), "folk");
- assert_eq!(expected, group.render(&TestColours, &users))
- }
- #[test]
- fn unnamed() {
- let users = MockUsers::with_current_uid(1000);
- let group = f::Group(100);
- let expected = TextCell::paint_str(Fixed(81).normal(), "100");
- assert_eq!(expected, group.render(&TestColours, &users));
- }
- #[test]
- fn primary() {
- let mut users = MockUsers::with_current_uid(2);
- users.add_user(User::new(2, "eve", 100));
- users.add_group(Group::new(100, "folk"));
- let group = f::Group(100);
- let expected = TextCell::paint_str(Fixed(80).normal(), "folk");
- assert_eq!(expected, group.render(&TestColours, &users))
- }
- #[test]
- fn secondary() {
- let mut users = MockUsers::with_current_uid(2);
- users.add_user(User::new(2, "eve", 666));
- let test_group = Group::new(100, "folk").add_member("eve");
- users.add_group(test_group);
- let group = f::Group(100);
- let expected = TextCell::paint_str(Fixed(80).normal(), "folk");
- assert_eq!(expected, group.render(&TestColours, &users))
- }
- #[test]
- fn overflow() {
- let group = f::Group(2_147_483_648);
- let expected = TextCell::paint_str(Fixed(81).normal(), "2147483648");
- assert_eq!(expected, group.render(&TestColours, &MockUsers::with_current_uid(0)));
- }
- }
|