Skip to content

Commit 4f7f2fb

Browse files
authored
Merge pull request #175 from Apokleos/strum-conv
2 parents da761c5 + 9e42588 commit 4f7f2fb

File tree

5 files changed

+335
-13
lines changed

5 files changed

+335
-13
lines changed

Cargo.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ serde_json = "1.0.66"
3030
quickcheck = { version = "1.0.3", optional = true }
3131
derive_builder = "0.20.0"
3232
getset = "0.1.1"
33+
strum = "0.26.2"
34+
strum_macros = "0.26.2"
3335

3436
[dev-dependencies]
3537
tempfile = "3.2.0"

src/distribution/error.rs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,15 @@ use derive_builder::Builder;
55
use getset::Getters;
66
use serde::{Deserialize, Serialize};
77
use std::fmt::{self, Display, Formatter};
8+
use strum_macros::{Display as StrumDisplay, EnumString};
89
use thiserror::Error;
910

1011
/// The string returned by and ErrorResponse error.
1112
pub const ERR_REGISTRY: &str = "distribution: registry returned error";
1213

1314
/// Unique identifier representing error code.
14-
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize)]
15+
#[derive(Clone, Debug, Deserialize, Eq, PartialEq, Serialize, StrumDisplay, EnumString)]
16+
#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
1517
#[serde(rename_all = "SCREAMING_SNAKE_CASE")]
1618
pub enum ErrorCode {
1719
/// Blob unknown to registry.

src/runtime/capability.rs

Lines changed: 60 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,12 @@ use serde::{
44
};
55
use std::collections::HashSet;
66

7+
use strum_macros::{Display, EnumString};
8+
79
/// Capabilities is a unique set of Capability values.
810
pub type Capabilities = HashSet<Capability>;
911

10-
#[derive(Clone, Copy, Debug, Eq, Hash, PartialEq, Serialize)]
12+
#[derive(Clone, Copy, Debug, EnumString, Eq, Display, Hash, PartialEq, Serialize)]
1113
/// All available capabilities.
1214
///
1315
/// For the purpose of performing permission checks, traditional UNIX
@@ -21,6 +23,7 @@ pub type Capabilities = HashSet<Capability>;
2123
/// Starting with kernel 2.2, Linux divides the privileges traditionally
2224
/// associated with superuser into distinct units, known as capabilities, which
2325
/// can be independently enabled and disabled. Capabilities are a per-thread attribute.
26+
#[strum(serialize_all = "SCREAMING_SNAKE_CASE")]
2427
pub enum Capability {
2528
#[serde(rename = "CAP_AUDIT_CONTROL")]
2629
/// Enable and disable kernel auditing; change auditing filter rules;
@@ -609,4 +612,60 @@ mod tests {
609612
assert!(res.contains(&Capability::Chown));
610613
Ok(())
611614
}
615+
616+
#[test]
617+
fn invalid_string2enum() {
618+
let invalid_cap_str = "INVALID_CAP";
619+
let unknown_cap = invalid_cap_str.parse::<Capability>();
620+
assert!(unknown_cap.is_err());
621+
}
622+
623+
#[test]
624+
fn cap_enum_to_string() {
625+
let cap = Capability::AuditControl;
626+
assert_eq!(cap.to_string(), "AUDIT_CONTROL");
627+
628+
let cap = Capability::AuditRead;
629+
assert_eq!(cap.to_string(), "AUDIT_READ");
630+
631+
let cap = Capability::SysAdmin;
632+
assert_eq!(cap.to_string(), "SYS_ADMIN");
633+
}
634+
635+
#[test]
636+
fn cap_string_to_enum() {
637+
let cap_str = "AUDIT_CONTROL";
638+
let cap_enum: Capability = cap_str.parse().unwrap();
639+
assert_eq!(cap_enum, Capability::AuditControl);
640+
641+
let cap_str = "AUDIT_READ";
642+
let cap_enum: Capability = cap_str.parse().unwrap();
643+
assert_eq!(cap_enum, Capability::AuditRead);
644+
645+
let cap_str = "SYS_ADMIN";
646+
let cap_enum: Capability = cap_str.parse().unwrap();
647+
assert_eq!(cap_enum, Capability::SysAdmin);
648+
}
649+
650+
#[test]
651+
fn test_serde_serialization() {
652+
let cap = Capability::AuditControl;
653+
let serialized = serde_json::to_string(&cap).unwrap();
654+
assert_eq!(serialized, "\"CAP_AUDIT_CONTROL\"");
655+
656+
let cap = Capability::SysAdmin;
657+
let serialized = serde_json::to_string(&cap).unwrap();
658+
assert_eq!(serialized, "\"CAP_SYS_ADMIN\"");
659+
}
660+
661+
#[test]
662+
fn test_serde_deserialization() {
663+
let serialized = "\"CAP_AUDIT_CONTROL\"";
664+
let cap: Capability = serde_json::from_str(serialized).unwrap();
665+
assert_eq!(cap, Capability::AuditControl);
666+
667+
let serialized = "\"CAP_SYS_ADMIN\"";
668+
let cap: Capability = serde_json::from_str(serialized).unwrap();
669+
assert_eq!(cap, Capability::SysAdmin);
670+
}
612671
}

0 commit comments

Comments
 (0)