# subspace

subspace is a **highly unstable** convenience crate for setting up management of and communication with external processes (nodes).

## Example

Add `subspace` to your `Cargo.toml`

```toml
[dependencies]
subspace = "0.1.0"
```

In your main process, create an `External` struct.

```rust
    // For the full example, check tests/node_tests.rs

    // name is the path + filename of the executable to launch
    let name = "target/debug/example";

    // address is the hostname + port the node should bind to
    let address = "localhost:2345";

    External::new(&name, address.to_string())?;
```

In your secondary process, parse command line arguments (done with [clap](https://github.com/clap-rs/clap/) in the example) and create a node.

```rust
fn main() {
    // Commandline arguments handled with clap, External will call the executable with --addr localhost:2345
    //
    let matches = App::new("Subspace example node")
        .author("ron")
        .about("An example process for subspace integration tests")
        .version("0.1")
        .arg(
            Arg::with_name("addr")
                .short("a")
                .long("addr")
                .help("Address this node should bind to")
                .takes_value(true),
        )
        .get_matches();

    // get address to bind to from arguments, then construct "this node"
    //
    let addr = matches.value_of("addr").unwrap();
    let mut node = Node::new(addr).unwrap();

    // call node.get_node_message() in this executables message loop, and act on it
    //
    loop {
        match node.get_node_message() {
            Some(NodeMessage::Exit) => break,
            _ => (),
        }

        // do work
    }
}
```

## License

Licensed under either of

* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or <http://www.apache.org/licenses/LICENSE-2.0>)
* MIT license ([LICENSE-MIT](LICENSE-MIT) or <http://opensource.org/licenses/MIT>)

at your option.

## Contribution

Unless you explicitly state otherwise, any contribution intentionally submitted
for inclusion in the work by you, as defined in the Apache-2.0 license, shall be
dual licensed as above, without any additional terms or conditions.
