Struct PermissionSetBuilder
pub struct PermissionSetBuilder { /* private fields */ }Expand description
Builder for creating permission sets with fluent API.
The crate::metadata::security::builders::PermissionSetBuilder provides a convenient way to build permission sets
programmatically with type-safe operations and validation. It follows the builder pattern
to enable readable and maintainable permission set construction for .NET Code Access Security.
§Design Benefits
- Fluent Interface: Method chaining for readable permission construction
- Type Safety: Each permission builder validates its specific constraints
- Composition: Easily combine multiple permission types in a single set
- Encoding Integration: Direct encoding to binary or XML formats
- Extensibility: Support for custom permissions alongside built-in types
§Usage Examples
use dotscope::metadata::security::{PermissionSetBuilder, PermissionSetFormat};
// Create a simple unrestricted permission set
let permission_bytes = PermissionSetBuilder::new()
.add_security_permission()
.unrestricted(true)
.build()
.encode(PermissionSetFormat::BinaryLegacy)?;§Thread Safety
This type is not Send or Sync because it contains mutable state for
building permissions. Use within a single thread and encode the result for
cross-thread sharing.
Implementations§
§impl PermissionSetBuilder
impl PermissionSetBuilder
pub fn new() -> Self
pub fn new() -> Self
Creates a new permission set builder.
Initializes an empty permission set builder ready to accept permission configurations.
The builder starts with no permissions and can be populated using the various
add_* methods or by directly adding crate::metadata::security::Permission instances.
§Returns
Returns a new crate::metadata::security::builders::PermissionSetBuilder instance ready for permission addition.
§Examples
use dotscope::metadata::security::PermissionSetBuilder;
let builder = PermissionSetBuilder::new();
assert_eq!(builder.permissions().len(), 0);pub fn add_permission(self, permission: Permission) -> Self
pub fn add_permission(self, permission: Permission) -> Self
Adds a custom permission to the set.
Directly adds a pre-constructed crate::metadata::security::Permission to the permission set.
This method is useful for adding custom permission types that don’t have dedicated
builder methods, or when you need full control over permission construction.
§Arguments
permission- A fully constructedcrate::metadata::security::Permissioninstance to add
§Returns
Returns the builder instance for method chaining.
§Examples
use dotscope::metadata::security::{
PermissionSetBuilder, Permission, NamedArgument, ArgumentType, ArgumentValue
};
let custom_permission = Permission {
class_name: "CustomNamespace.CustomPermission".to_string(),
assembly_name: "CustomAssembly".to_string(),
named_arguments: vec![
NamedArgument {
name: "Level".to_string(),
arg_type: ArgumentType::Int32,
value: ArgumentValue::Int32(5),
}
],
};
let builder = PermissionSetBuilder::new()
.add_permission(custom_permission);pub fn add_security_permission(self) -> SecurityPermissionBuilder
pub fn add_security_permission(self) -> SecurityPermissionBuilder
Starts building a SecurityPermission.
Creates a new crate::metadata::security::builders::SecurityPermissionBuilder for configuring a
System.Security.Permissions.SecurityPermission instance. This permission type
controls fundamental security operations like skipping verification, controlling
policy, and managing evidence.
§Returns
Returns a crate::metadata::security::builders::SecurityPermissionBuilder for configuring security permissions.
§Examples
use dotscope::metadata::security::PermissionSetBuilder;
let builder = PermissionSetBuilder::new()
.add_security_permission()
.flags("Execution, SkipVerification")
.build();pub fn add_file_io_permission(self) -> FileIOPermissionBuilder
pub fn add_file_io_permission(self) -> FileIOPermissionBuilder
Starts building a FileIOPermission.
Creates a new crate::metadata::security::builders::FileIOPermissionBuilder for configuring a
System.Security.Permissions.FileIOPermission instance. This permission type
controls file system access including read, write, and append operations on
specific paths or with unrestricted access.
§Returns
Returns a crate::metadata::security::builders::FileIOPermissionBuilder for configuring file I/O permissions.
§Examples
use dotscope::metadata::security::PermissionSetBuilder;
let builder = PermissionSetBuilder::new()
.add_file_io_permission()
.read_paths(&["C:\\Data"])
.write_paths(&["C:\\Logs"])
.build();pub fn encode(self, format: PermissionSetFormat) -> Result<Vec<u8>>
pub fn encode(self, format: PermissionSetFormat) -> Result<Vec<u8>>
Encodes the permission set to the specified format.
Converts the built permission set to binary representation using the specified format.
This method consumes the builder and delegates to crate::metadata::security::encode_permission_set
for the actual encoding process.
§Arguments
format- The targetcrate::metadata::security::PermissionSetFormatfor encoding
§Returns
Returns the encoded permission set as a byte vector, or an error if encoding fails.
§Errors
Returns crate::Error in the following cases:
- [
crate::Error::Malformed] - When permission data contains unsupported types - [
crate::Error::Malformed] - When the target format iscrate::metadata::security::PermissionSetFormat::Unknown
§Examples
use dotscope::metadata::security::{PermissionSetBuilder, PermissionSetFormat};
let binary_data = PermissionSetBuilder::new()
.add_security_permission()
.unrestricted(true)
.build()
.encode(PermissionSetFormat::BinaryLegacy)?;
let xml_data = PermissionSetBuilder::new()
.add_security_permission()
.unrestricted(true)
.build()
.encode(PermissionSetFormat::Xml)?;pub fn permissions(self) -> Vec<Permission>
pub fn permissions(self) -> Vec<Permission>
Gets the built permissions.
Consumes the builder and returns the constructed permission collection. This method is useful when you need access to the permission structures without encoding them, such as for further processing or validation.
§Returns
Returns a vector of crate::metadata::security::Permission instances that were built.
§Examples
use dotscope::metadata::security::PermissionSetBuilder;
let permissions = PermissionSetBuilder::new()
.add_security_permission()
.unrestricted(true)
.build()
.permissions();
assert_eq!(permissions.len(), 1);
assert_eq!(permissions[0].class_name, "System.Security.Permissions.SecurityPermission");Trait Implementations§
Auto Trait Implementations§
impl Freeze for PermissionSetBuilder
impl RefUnwindSafe for PermissionSetBuilder
impl Send for PermissionSetBuilder
impl Sync for PermissionSetBuilder
impl Unpin for PermissionSetBuilder
impl UnsafeUnpin for PermissionSetBuilder
impl UnwindSafe for PermissionSetBuilder
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
Source§impl<T> Downcast for T
impl<T> Downcast for T
impl<T> ErasedDestructor for Twhere
T: 'static,
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
impl<F, T> IntoSample<T> for Fwhere
T: FromSample<F>,
fn into_sample(self) -> T
Source§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> PolicyExt for Twhere
T: ?Sized,
impl<T> Read<Exclusive, BecauseExclusive> for Twhere
T: ?Sized,
Source§impl<R, P> ReadPrimitive<R> for P
impl<R, P> ReadPrimitive<R> for P
Source§fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
fn read_from_little_endian(read: &mut R) -> Result<Self, Error>
ReadEndian::read_from_little_endian().Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self is actually part of its subset T (and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self to the equivalent element of its superset.