Struct Environment

Source
pub struct Environment<'i, 'o, 'c> { /* private fields */ }
Expand description

The execution environment for Knight programs.

To aid in embedding Knight in other systems, the Environment provides complete control over the stdin, stdout, and output of the “system” (`), in addition to keeping track of all relevant variables. Because of this, the environment must always be passed when calling Value::run.

This is in contrast with most other Knight implementations, which usually have a singular, global “environment”, and

§Examples

let mut env = Environment::new();

// Write to stdout.
writeln!(env, "Hello, world!");

// Read from stdin.
let mut str = String::new();
env.read_to_string(&mut str).expect("cant read from stdin!");

// execute command
println!("The stdout of `ls -al` is {}", env.system("ls -al").expect("`ls -al` failed"));

// create a variable
let var = env.get("foobar");
assert_eq!(var, env.get("foobar")); // both variables are the same.

Implementations§

Source§

impl<'i, 'o, 'c> Environment<'i, 'o, 'c>

Source

pub fn new() -> Self

Creates an empty Environment.

§Examples
let env = Environment::new();

// ...do stuff with `env`.
Source

pub fn builder() -> Builder<'i, 'o, 'c>

Creates a new Builder.

This is simply a helper function, and is provided so that you don’t have to import Builder.

§Examples
let env = Environment::builder().disable_system().build();

// ... do stuff with `env`.
Source

pub fn get<N: AsRef<str> + ToString + ?Sized>(&mut self, name: &N) -> Variable

Retrieves the variable with the given name.

This method will always succeed; if this is the first time that name has been seen by self, a new (unassigned ) variable will be created.

§Examples
let mut env = Environment::new();
let var = env.get("plato");

assert_eq!(var, env.get("plato"));
Source

pub fn system(&mut self, cmd: &str) -> Result<Text>

Executes cmd as a system command, returning the stdout of the child process.

This will internally call the value that was set for Builder::system. See that function for more details on, eg, the default value.

§Examples
let mut env = Environment::new();

assert_eq!(env.system("echo 'hello, knight!'").unwrap().as_str(), "hello, knight!\n");
Source

pub fn run_str<S: AsRef<str>>(&mut self, input: S) -> Result<Value>

Runs the given string as Knight code, returning the result of its execution.

Source

pub fn run<I>(&mut self, input: I) -> Result<Value>
where I: IntoIterator<Item = char>,

Parses a Value from the given iterator and then runs the value.

Trait Implementations§

Source§

impl BufRead for Environment<'_, '_, '_>

Source§

fn fill_buf(&mut self) -> Result<&[u8]>

Returns the contents of the internal buffer, filling it with more data, via Read methods, if empty. Read more
Source§

fn consume(&mut self, amnt: usize)

Marks the given amount of additional bytes from the internal buffer as having been read. Subsequent calls to read only return bytes that have not been marked as read. Read more
Source§

fn read_line(&mut self, buf: &mut String) -> Result<usize>

Reads all bytes until a newline (the 0xA byte) is reached, and append them to the provided String buffer. Read more
Source§

fn has_data_left(&mut self) -> Result<bool, Error>

🔬This is a nightly-only experimental API. (buf_read_has_data_left)
Checks if there is any data left to be read. Read more
1.0.0 · Source§

fn read_until(&mut self, byte: u8, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes into buf until the delimiter byte or EOF is reached. Read more
1.83.0 · Source§

fn skip_until(&mut self, byte: u8) -> Result<usize, Error>

Skips all bytes until the delimiter byte or EOF is reached. Read more
1.0.0 · Source§

fn split(self, byte: u8) -> Split<Self>
where Self: Sized,

Returns an iterator over the contents of this reader split on the byte byte. Read more
1.0.0 · Source§

fn lines(self) -> Lines<Self>
where Self: Sized,

Returns an iterator over the lines of this reader. Read more
Source§

impl Debug for Environment<'_, '_, '_>

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more
Source§

impl Default for Environment<'_, '_, '_>

Source§

fn default() -> Self

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

impl Read for Environment<'_, '_, '_>

Source§

fn read(&mut self, data: &mut [u8]) -> Result<usize>

Read bytes into data from self’s stdin.

The stdin can be customized at creation via Builder::stdin.

1.36.0 · Source§

fn read_vectored(&mut self, bufs: &mut [IoSliceMut<'_>]) -> Result<usize, Error>

Like read, except that it reads into a slice of buffers. Read more
Source§

fn is_read_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Reader has an efficient read_vectored implementation. Read more
1.0.0 · Source§

fn read_to_end(&mut self, buf: &mut Vec<u8>) -> Result<usize, Error>

Reads all bytes until EOF in this source, placing them into buf. Read more
1.0.0 · Source§

fn read_to_string(&mut self, buf: &mut String) -> Result<usize, Error>

Reads all bytes until EOF in this source, appending them to buf. Read more
1.6.0 · Source§

fn read_exact(&mut self, buf: &mut [u8]) -> Result<(), Error>

Reads the exact number of bytes required to fill buf. Read more
Source§

fn read_buf(&mut self, buf: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Pull some bytes from this source into the specified buffer. Read more
Source§

fn read_buf_exact(&mut self, cursor: BorrowedCursor<'_>) -> Result<(), Error>

🔬This is a nightly-only experimental API. (read_buf)
Reads the exact number of bytes required to fill cursor. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adaptor for this instance of Read. Read more
1.0.0 · Source§

fn bytes(self) -> Bytes<Self>
where Self: Sized,

Transforms this Read instance to an Iterator over its bytes. Read more
1.0.0 · Source§

fn chain<R>(self, next: R) -> Chain<Self, R>
where R: Read, Self: Sized,

Creates an adapter which will chain this stream with another. Read more
1.0.0 · Source§

fn take(self, limit: u64) -> Take<Self>
where Self: Sized,

Creates an adapter which will read at most limit bytes from it. Read more
Source§

impl Write for Environment<'_, '_, '_>

Source§

fn write(&mut self, data: &[u8]) -> Result<usize>

Writes data’s bytes into self’s stdout.

The stdin can be customized at creation via Builder::stdin.

Source§

fn flush(&mut self) -> Result<()>

Flushes this output stream, ensuring that all intermediately buffered contents reach their destination. Read more
1.36.0 · Source§

fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize, Error>

Like write, except that it writes from a slice of buffers. Read more
Source§

fn is_write_vectored(&self) -> bool

🔬This is a nightly-only experimental API. (can_vector)
Determines if this Writer has an efficient write_vectored implementation. Read more
1.0.0 · Source§

fn write_all(&mut self, buf: &[u8]) -> Result<(), Error>

Attempts to write an entire buffer into this writer. Read more
Source§

fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<(), Error>

🔬This is a nightly-only experimental API. (write_all_vectored)
Attempts to write multiple buffers into this writer. Read more
1.0.0 · Source§

fn write_fmt(&mut self, args: Arguments<'_>) -> Result<(), Error>

Writes a formatted string into this writer, returning any error encountered. Read more
1.0.0 · Source§

fn by_ref(&mut self) -> &mut Self
where Self: Sized,

Creates a “by reference” adapter for this instance of Write. Read more

Auto Trait Implementations§

§

impl<'i, 'o, 'c> Freeze for Environment<'i, 'o, 'c>

§

impl<'i, 'o, 'c> !RefUnwindSafe for Environment<'i, 'o, 'c>

§

impl<'i, 'o, 'c> !Send for Environment<'i, 'o, 'c>

§

impl<'i, 'o, 'c> !Sync for Environment<'i, 'o, 'c>

§

impl<'i, 'o, 'c> Unpin for Environment<'i, 'o, 'c>

§

impl<'i, 'o, 'c> !UnwindSafe for Environment<'i, 'o, 'c>

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> 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<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

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