npm package: @svelte-up/projen-rust-project
Description: <div align="center">     <h1>Projen Rust Project</h1>     <a href="https://circleci.com/gh/GetSvelteUp/projen-rust-project/tree/main">         <img src="https://circleci.com/gh/GetSvelteUp/projen-rust-project/tree/main.svg?style=svg"/>     </a>     <a hre
Author: Michael Edelman
Latest version: 0.0.16

<div align="center">
    <h1>Projen Rust Project</h1>
    <a href="https://circleci.com/gh/GetSvelteUp/projen-rust-project/tree/main">
        <img src="https://circleci.com/gh/GetSvelteUp/projen-rust-project/tree/main.svg?style=svg"/>
    </a>
    <a href="https://opensource.org/licenses/Apache-2.0">
        <img src="https://img.shields.io/badge/License-Apache%202.0-yellowgreen.svg"/>
    </a>
    <br />
    <hr />
</div>

An **very experimental** plugin (project generator) for [projen](https://github.com/projen/projen) that aims to make spinning up and maintaining cargo-based rustlang projects easy and predicatable.

## Getting Started

To create a new project, run the following command and follow the instructions.

```sh
$ mkdir my-project
$ cd my-project
$ git init
$ npx projen new --from @svelte-up/projen-rust-project
```

> Use `npx projen new --from @svelte-up/projen-rust-project --help` to view a list of command line switches that allow you to specify most project options during bootstrapping.

The `new` command will create a `.projenrc.js` file which looks like the below for `projen-rust-project` projects.

```js
const { RustProjectBase } = require("@svelte-up/projen-rust-project");

const project = new RustProjectBase({
  defaultReleaseBranch: "main",
  devDeps: ["@svelte-up/projen-rust-project"],
  name: "projen-rust-project-example",
});

project.synth();
```

This configuration instantiates your project with minimal setup, and synthesizes default project files.

## Next Steps

Once your project is created, you can configure the project by editing `.projenrc.js` and re-running `npx projen` to re-synthesize.

### Customize the Generated Cargo Manifest

```ts
interface RustProjectBaseOptions extends TypeScriptProjectOptions {
  readonly manifest: CargoManifest;
  readonly target: string;
}
```

At present, the structure and configuration of your project is primarily controlled via the `manifest` property on the `RustProjectBaseOptions` interface. Here, you control how your `Cargo.toml` file is generated.

For example, the `.projenrc.js` configuration below generates the subsequent `Cargo.toml`:

`.projenrc.js`

```js
// .projenrc.js

const project = new RustProjectBase({
  defaultReleaseBranch: "main",
  devDeps: ["@getsvelteup/projen-rust-project"],
  name: "projen-test-2",
  manifest: {
    package: {
      name: "projen-test",
      version: "0.0.1",
      edition: "2021",
      authors: ["Michael Edelman <michael@svelteup.io>"],
      license: "Apache-2.0",
    },
    dependencies: {
      lambda_http: "0.4.1",
      tokio: { version: "1", features: ["full"] },
      serde_json: "1.0.64",
      simple_logger: "1.13.0",
      log: "0.4.14",
    },
    devDependencies: {
      pretty_assertions: "1.0.0",
    },
    profile: {
      dev: {
        lto: false,
      },
      release: {
        lto: true,
        panic: "abort",
      },
    },
  },
});
```

`Cargo.toml`

```toml
# ~~ Generated by projen. To modify, edit .projenrc.js and run "npx projen".

[package]
name = "projen-test"
version = "0.0.1"
edition = "2021"
authors = [ "Michael Edelman <michael@svelteup.io>" ]
license = "Apache-2.0"

[dependencies]
lambda_http = "0.4.1"
serde_json = "1.0.64"
simple_logger = "1.13.0"
log = "0.4.14"

  [dependencies.tokio]
  version = "1"
  features = [ "full" ]

[profile.dev]
lto = false
debug = 1
incremental = true

[profile.release]
lto = true
debug = false
incremental = true
panic = "abort"

[dev-dependencies]
pretty_assertions = "1.0.0"
```

`Cargo.toml` support is pretty robust; however, some features and or settings are currently in development. For a full overview see the API Reference section below.

### Add Additional Binaries, Tests, Examples, and Benches

Binaries, tests, examples, and benches can be incldued directly via the `manifest` configuration above. Alternatively, you can use the various helper methods on your project to do the same. For every binary, test, example, or bench included, the project will automatically stub out the item at its expected location and modify the `Cargo.toml` file appropriately.

```js
project.addBinary("bootstrap", {
  name: "bootstrap",
  path: "src/bin/bootstrap.rs",
});

project.addBinary("another", {
  name: "another",
  path: "src/bin/another.rs",
  doc: false,
  edition: "2018",
});
```

### Build, Test, Etc.

Projen rust project also generates a `package.json` file with various execution scripts for interacting with your project based on your custom configuration defined above. For example, adding the two binaries above will result in the creation of the following:

```json
{
  "scripts": {
    "build": "npx npm-run-all -p build:*",
    "build:bootstrap": "cargo build --release  --bin bootstrap",
    "build:another": "cargo build --release  --bin another"
  }
}
```

Thereafter, you can build individual binaries by running `yarn build:<binary-name>` or build all of them simply by running `yarn build`.

# API Reference

See [API Reference](https://github.com/GetSvelteUp/projen-rust-project/blob/main/API.md) for API details.

# Contributions

Contributions of all kinds are welcome! For a quick start, check out a development environment.

```sh
$ git clone git@github.com:GetSvelteUp/projen-rust-project
$ cd projen-rust-project
$ yarn
$ yarn watch
```

## License

Distributed under the [Apache-2.0](./LICENSE) license.