Skip to main content

PermissionSetBuilder

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

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

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
§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

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

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>>

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
§Returns

Returns the encoded permission set as a byte vector, or an error if encoding fails.

§Errors

Returns crate::Error in the following cases:

§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>

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§

§

impl Default for PermissionSetBuilder

§

fn default() -> Self

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> AsAny for T
where T: Any,

Source§

fn as_any(&self) -> &(dyn Any + 'static)

Source§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Source§

fn type_name(&self) -> &'static str

Gets the type name of self
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<ST, DT> CastableFrom<ST, Initialized, Initialized> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<ST, DT> CastableFrom<ST, Uninit, Uninit> for DT
where ST: ?Sized, DT: ?Sized,

Source§

impl<T> Downcast for T
where T: AsAny + ?Sized,

Source§

fn is<T>(&self) -> bool
where T: AsAny,

Returns true if the boxed type is the same as T. Read more
Source§

fn downcast_ref<T>(&self) -> Option<&T>
where T: AsAny,

Forward to the method defined on the type Any.
Source§

fn downcast_mut<T>(&mut self) -> Option<&mut T>
where T: AsAny,

Forward to the method defined on the type Any.
Source§

impl<T> ErasedDestructor for T
where T: 'static,

Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, A> IntoAst<A> for T
where T: Into<A>, A: Ast,

Source§

fn into_ast(self, _a: &A) -> A

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<F, T> IntoSample<T> for F
where T: FromSample<F>,

Source§

fn into_sample(self) -> T

Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> PolicyExt for T
where T: ?Sized,

Source§

fn and<P, B, E>(self, other: P) -> And<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow only if self and other return Action::Follow. Read more
Source§

fn or<P, B, E>(self, other: P) -> Or<T, P>
where T: Sized + Policy<B, E>, P: Policy<B, E>,

Create a new Policy that returns Action::Follow if either self or other returns Action::Follow. Read more
Source§

impl<T> Read<Exclusive, BecauseExclusive> for T
where T: ?Sized,

Source§

impl<R, P> ReadPrimitive<R> for P
where R: Read + ReadEndian<P>, P: Default,

Source§

fn read_from_little_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_little_endian().
Source§

fn read_from_big_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_big_endian().
Source§

fn read_from_native_endian(read: &mut R) -> Result<Self, Error>

Read this value from the supplied reader. Same as ReadEndian::read_from_native_endian().
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<V, T> VZip<V> for T
where V: MultiLane<T>,

Source§

fn vzip(self) -> V

Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more