Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/fanzeyi/cargo-play

A local Rust playground
https://github.com/fanzeyi/cargo-play

cargo rust

Last synced: 5 days ago
JSON representation

A local Rust playground

Awesome Lists containing this project

README

        

# cargo-play

[![Build Status](https://travis-ci.org/fanzeyi/cargo-play.svg?branch=master)](https://travis-ci.org/fanzeyi/cargo-play) [![Crates.io](https://img.shields.io/crates/v/cargo-play)](https://crates.io/crates/cargo-play)

`cargo-play` is a tool to help you running your Rust code file without manually setting up a Cargo project.

## See it in action

## Install

```
cargo install cargo-play
```

## Usage

Simply running `cargo play ` is sufficient. You can specify your external dependency at the
beginning of your file with the prefix `//#`. It accepts the same TOML syntax as in `Cargo.toml`.

## Example

```rust
$ cat serde_json.rs
//# serde_json = "*"

use serde_json::{Result, Value};

fn main() -> Result<()> {
// Some JSON input data as a &str. Maybe this comes from the user.
let data = r#"
{
"name": "John Doe",
"age": 43,
"phones": [
"+44 1234567",
"+44 2345678"
]
}"#;

// Parse the string of data into serde_json::Value.
let v: Value = serde_json::from_str(data)?;

// Access parts of the data by indexing with square brackets.
println!("Please call {} at the number {}", v["name"], v["phones"][0]);

Ok(())
}

$ cargo play serde_json.rs
Updating crates.io index
Compiling serde v1.0.91
Compiling ryu v0.2.8
Compiling itoa v0.4.4
Compiling serde_json v1.0.39
Compiling gvzcg8yviqmd_euq3xti4-zbkrs v0.1.0 (/var/folders/nq/608n9lcx02n_mzx33_3z5wyw0000gn/T/cargo-play.GVzCg8yviQmd_EUq3Xti4-ZbKRs)
Finished dev [unoptimized + debuginfo] target(s) in 10.23s
Running `/var/folders/nq/608n9lcx02n_mzx33_3z5wyw0000gn/T/cargo-play.GVzCg8yviQmd_EUq3Xti4-ZbKRs/target/debug/gvzcg8yviqmd_euq3xti4-zbkrs`
Please call "John Doe" at the number "+44 1234567"
```

It also supports running multiple files at the same time:

```rust
$ cat tests/multi/entry.rs
mod hello;

fn main() {
println!("Hello {}", hello::world());
}
$ cat tests/multi/hello.rs
pub fn world() -> String {
"World".into()
}
$ cargo play tests/multi/*
Compiling qvsjdw04fxh5cgpdkdvg6ite_ak v0.1.0 (/var/folders/nq/608n9lcx02n_mzx33_3z5wyw0000gn/T/cargo-play.QVSJDw04FxH5CGpDkDvg6itE_ak)
Finished dev [unoptimized + debuginfo] target(s) in 0.30s
Running `/var/folders/nq/608n9lcx02n_mzx33_3z5wyw0000gn/T/cargo-play.QVSJDw04FxH5CGpDkDvg6itE_ak/target/debug/qvsjdw04fxh5cgpdkdvg6ite_ak`
Hello World
```

Files under sub-directories will be copied and placed relatively to the first file. Try:

cargo play tests/subdirs/**/*.rs

## To Do

- [ ] Editor plugins
- [x] Vim
- [ ] VS Code
- [x] Toolchain supports
- [x] Edition Support

## Editor Support

### Vim

Add this line to your `.vimrc` or `init.vim`:

```vim
command! CargoPlay !cargo play %
```

With your code file open, running `:CargoPlay` will allow you to test your current file within an auto-generated cargo project.

### VSCode

Install the [VSCode Extension](./extension/README.md)

OR

Open Command Palette and select **Configure Task**
- *This will either create a new tasks.json or open your existing tasks.json*

Add the following [task](./.vscode/tasks.json):

```json
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "CargoPlay",
"command": "cargo",
"args": [
"play",
"${file}",
],
"problemMatcher": [
"$rustc"
]
}
]
}
```

Now open the Command Palette, select **Run Task** and then run the new **CargoPlay** task

### Micro

add this to your [micro](https://micro-editor.github.io/) `~/.config/micro/init.lua`

```lua
local config = import("micro/config")
local shell = import("micro/shell")

function init()
config.TryBindKey("Alt-b", "lua:initlua.play", true)
config.MakeCommand("cargoplay", play, config.NoComplete)
end

function play(bp)

bp:Save()

if bp.Buf:FileType() == "rust" then
shell.RunInteractiveShell("cargo play " .. bp.Buf.Path, true, false)
end
end

```

Then you can hit **Alt** + **b** to __build__ your current file usig `cargo play` or you can use **Ctrl** + **E** and in the command console type **cargoplay**

## Acknowledgements

This project is inspired by [play.rust-lang.org](https://play.rust-lang.org) and [RustPlayground](https://github.com/cmyr/RustPlayground).