| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204 |
- // SPDX-FileCopyrightText: 2024 Christina Sørensen
- // SPDX-License-Identifier: EUPL-1.2
- //
- // SPDX-FileCopyrightText: 2023-2024 Christina Sørensen, eza contributors
- // SPDX-FileCopyrightText: 2014 Benjamin Sago
- // SPDX-License-Identifier: MIT
- use nu_ansi_term::Style;
- use crate::fs::fields as f;
- use crate::output::cell::TextCell;
- pub trait Render {
- fn render(&self, style: Style) -> TextCell;
- }
- impl Render for Option<f::OctalPermissions> {
- fn render(&self, style: Style) -> TextCell {
- match self {
- Some(p) => {
- let perm = &p.permissions;
- #[rustfmt::skip]
- let octal_sticky = f::OctalPermissions::bits_to_octal(
- perm.setuid,
- perm.setgid,
- perm.sticky
- );
- let octal_owner = f::OctalPermissions::bits_to_octal(
- perm.user_read,
- perm.user_write,
- perm.user_execute,
- );
- let octal_group = f::OctalPermissions::bits_to_octal(
- perm.group_read,
- perm.group_write,
- perm.group_execute,
- );
- let octal_other = f::OctalPermissions::bits_to_octal(
- perm.other_read,
- perm.other_write,
- perm.other_execute,
- );
- TextCell::paint(
- style,
- format!("{octal_sticky}{octal_owner}{octal_group}{octal_other}"),
- )
- }
- None => TextCell::paint(style, "----".into()),
- }
- }
- }
- impl f::OctalPermissions {
- fn bits_to_octal(r: bool, w: bool, x: bool) -> u8 {
- u8::from(r) * 4 + u8::from(w) * 2 + u8::from(x)
- }
- }
- #[cfg(test)]
- pub mod test {
- use super::Render;
- use crate::fs::fields as f;
- use crate::output::cell::TextCell;
- use nu_ansi_term::Color::*;
- #[test]
- fn normal_folder() {
- let bits = f::Permissions {
- user_read: true,
- user_write: true,
- user_execute: true,
- setuid: false,
- group_read: true,
- group_write: false,
- group_execute: true,
- setgid: false,
- other_read: true,
- other_write: false,
- other_execute: true,
- sticky: false,
- };
- let octal = Some(f::OctalPermissions { permissions: bits });
- let expected = TextCell::paint_str(Purple.bold(), "0755");
- assert_eq!(expected, octal.render(Purple.bold()));
- }
- #[test]
- fn normal_file() {
- let bits = f::Permissions {
- user_read: true,
- user_write: true,
- user_execute: false,
- setuid: false,
- group_read: true,
- group_write: false,
- group_execute: false,
- setgid: false,
- other_read: true,
- other_write: false,
- other_execute: false,
- sticky: false,
- };
- let octal = Some(f::OctalPermissions { permissions: bits });
- let expected = TextCell::paint_str(Purple.bold(), "0644");
- assert_eq!(expected, octal.render(Purple.bold()));
- }
- #[test]
- fn secret_file() {
- let bits = f::Permissions {
- user_read: true,
- user_write: true,
- user_execute: false,
- setuid: false,
- group_read: false,
- group_write: false,
- group_execute: false,
- setgid: false,
- other_read: false,
- other_write: false,
- other_execute: false,
- sticky: false,
- };
- let octal = Some(f::OctalPermissions { permissions: bits });
- let expected = TextCell::paint_str(Purple.bold(), "0600");
- assert_eq!(expected, octal.render(Purple.bold()));
- }
- #[test]
- fn sticky1() {
- let bits = f::Permissions {
- user_read: true,
- user_write: true,
- user_execute: true,
- setuid: true,
- group_read: true,
- group_write: true,
- group_execute: true,
- setgid: false,
- other_read: true,
- other_write: true,
- other_execute: true,
- sticky: false,
- };
- let octal = Some(f::OctalPermissions { permissions: bits });
- let expected = TextCell::paint_str(Purple.bold(), "4777");
- assert_eq!(expected, octal.render(Purple.bold()));
- }
- #[test]
- fn sticky2() {
- let bits = f::Permissions {
- user_read: true,
- user_write: true,
- user_execute: true,
- setuid: false,
- group_read: true,
- group_write: true,
- group_execute: true,
- setgid: true,
- other_read: true,
- other_write: true,
- other_execute: true,
- sticky: false,
- };
- let octal = Some(f::OctalPermissions { permissions: bits });
- let expected = TextCell::paint_str(Purple.bold(), "2777");
- assert_eq!(expected, octal.render(Purple.bold()));
- }
- #[test]
- fn sticky3() {
- let bits = f::Permissions {
- user_read: true,
- user_write: true,
- user_execute: true,
- setuid: false,
- group_read: true,
- group_write: true,
- group_execute: true,
- setgid: false,
- other_read: true,
- other_write: true,
- other_execute: true,
- sticky: true,
- };
- let octal = Some(f::OctalPermissions { permissions: bits });
- let expected = TextCell::paint_str(Purple.bold(), "1777");
- assert_eq!(expected, octal.render(Purple.bold()));
- }
- }
|