Skip to content

Commit

Permalink
feat(builtins): introduce allow!-macro
Browse files Browse the repository at this point in the history
  • Loading branch information
sivizius committed Jul 3, 2024
1 parent b56d18c commit ca4fc4c
Showing 1 changed file with 167 additions and 18 deletions.
185 changes: 167 additions & 18 deletions src/builtins/mod.rs
Original file line number Diff line number Diff line change
@@ -1,5 +1,171 @@
//! Built-in [`RuleSet`](crate::RuleSet)s
/// Implement `allow_*`-methods.
///
/// See e.g. `time.mod` and `user_id.mod`.
///
/// NOTE: Follow the `@labels`.
macro_rules! allow {
(
$(#[$attr:meta])*
$vis:vis fn $method:ident($self:ident) {
$($inner:tt)*
}
) => {
allow! {
@impl_outer ()
$(#[$attr])*
$vis fn $method($self) -> Self {
$($inner)*
}
}
};

(
$(#[$attr:meta])*
$vis:vis unsafe fn $method:ident($self:ident) {
$($inner:tt)*
}
) => {
allow! {
@impl_outer (unsafe)
$(#[$attr])*
$vis fn $method($self) -> YesReally<Self> {
$($inner)*
}
}
};

(
$(
$(#[$attr:meta])*
$vis:vis $($outer:ident)+($self:ident) { $($inner:tt)* }
)*
) => {
$(
allow! {
$(#[$attr])*
$vis $($outer)+($self) {
$($inner)*
}
}
)*
};

(
@impl_outer ($($unsafe:ident)?)
$(#[$outer_attr:meta])*
$outer_vis:vis fn $outer_method:ident($self:ident) -> $output:ty {
$(
$(#[$inner_attr:meta])*
$inner_vis:vis $($inner:ident)+ ($syscall:ident);
)*
}
) => {
$(#[$outer_attr])*
$outer_vis fn $outer_method($self) -> $output {
allow! { @call_inner_block $($unsafe)? $self { $(($($inner)+))* } }
}

allow! {
@impl_inner_block $($unsafe)? {
$(
$(#[$inner_attr])*
$inner_vis $($inner)+ ($syscall)
)*
}
}
};

( @call_inner_block $self:ident { $(($($inner:ident)+))* } ) => {
let this = $self;
$( allow! { @call_inner this: $($inner)+ } )*
this
};

( @call_inner_block unsafe $self:ident { $(($($inner:ident)+))* } ) => {
let this = $self;
$( allow! { @call_inner this: unsafe $($inner)+ } )*
YesReally::new(this)
};

( @call_inner $this:ident: fn $method:ident ) => {
let $this = $this.$method();
};

( @call_inner $this:ident: unsafe $(unsafe)? fn $method:ident ) => {
let $this = $this.$method().yes_really();
};

(
@impl_inner_block {
$(
$(#[$attr:meta])*
$vis:vis $($inner:ident)+($syscall:ident)
)*
}
) => {
$(
allow! {
@impl_inner
$(#[$attr])*
$vis $($inner)+($syscall)
}
)*
};

(
@impl_inner_block
unsafe {
$(
$(#[$attr:meta])*
$vis:vis $(unsafe)? fn $method:ident($syscall:ident)
)*
}
) => {
$(
allow! {
@impl_inner
$(#[$attr])*
$vis unsafe fn $method($syscall)
}
)*
};

(
@impl_inner
$(#[$attr:meta])*
$vis:vis fn $method:ident($syscall:ident)
) => {
$(#[$attr])*
$vis fn $method(mut self) -> Self {
let _ = self.syscalls.insert(syscalls::Sysno::$syscall);
self
}
};

(
@impl_inner
$(#[$attr:meta])*
$vis:vis unsafe fn $method:ident($syscall:ident)
) => {
$(#[$attr])*
$vis fn $method(mut self) -> YesReally<Self> {
let _ = self.syscalls.insert(syscalls::Sysno::$syscall);
YesReally::new(self)
}
};
}

pub mod basic;
pub mod danger_zone;
pub mod network;
pub mod pipes;
pub mod systemio;
pub mod time;

pub use {basic::BasicCapabilities, network::Networking, systemio::SystemIO, time::Time};

/// A struct whose purpose is to make you read the documentation for the function you're calling.
/// If you're reading this, go read the documentation for the function that is returning this
/// object.
Expand All @@ -16,23 +182,6 @@ impl<T> YesReally<T> {

/// Make a [`YesReally`].
pub fn new(inner: T) -> YesReally<T> {
YesReally {
inner,
}
YesReally { inner }
}
}

pub mod basic;
pub use basic::BasicCapabilities;

pub mod systemio;
pub use systemio::SystemIO;

pub mod network;
pub use network::Networking;

pub mod time;
pub use time::Time;

pub mod danger_zone;
pub mod pipes;

0 comments on commit ca4fc4c

Please sign in to comment.