• Stars
    star
    569
  • Rank 78,369 (Top 2 %)
  • Language
    Rust
  • License
    Apache License 2.0
  • Created over 6 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

Application microframework with command-line option parsing, configuration, error handling, logging, and shell interactions

Abscissa

Crate Docs Apache 2.0 Licensed MSRV Safety Dance Build Status Gitter Chat

Abscissa is a microframework for building Rust applications (either CLI tools or network/web services), aiming to provide a large number of features with a minimal number of dependencies, and with a strong focus on security.

Documentation

Features

  • command-line option parsing: simple declarative option parser based on [clap]. The option parser in Abcissa contains numerous improvements which provide better UX and tighter integration with the other parts of the framework (e.g. overriding configuration settings using command-line options).
  • components: Abscissa uses a component architecture (similar to an ECS) for extensibility/composability, with a minimalist implementation that still provides such features such as calculating dependency ordering and providing hooks into the application lifecycle. Newly generated apps use two components by default: terminal and logging.
  • configuration: Simple parsing of TOML configurations to serde-parsed configuration types which can be dynamically updated at runtime.
  • error handling: unified error-handling subsystem with generic error type.
  • logging: based on the log to provide application-level logging.
  • secrets management: the (optional) secrets module includes a Secret type which derives serde's Deserialize and can be used to represent secret values parsed from configuration files or elsewhere (e.g. credentials loaded from the environment or network requests)
  • terminal interactions: support for colored terminal output (with color support autodetection). Useful for Cargo-like status messages with easy-to-use macros.

Projects Using Abscissa

  • Canister: deployment utility for "distroless" containers/microVMs
  • cargo-audit: audit Cargo projects for security vulnerabilities
  • cargo-rpm: build RPMs out of Cargo projects
  • cosmon: observability tool for Tendermint applications
  • ibc-rs: Rust implementation of Interblockchain Communication (IBC) modules and relayer
  • OpenLibra: open platform for financial inclusion. Not run by Facebook.
  • rustic: fast, encrypted, and deduplicated backups
  • Synchronicity: distributed build system providing BFT proofs-of-reproducibility
  • Tendermint KMS: key management system for Tendermint applications
  • Zebra: Rust implementation of a Zcash node
  • Zerostash: Encrypted and deduplicated backups

Crate Structure

Abscissa presently consists of three crates:

  • abscissa: CLI app and application generator - cargo install abscissa
  • abscissa_core: main framework library
  • abscissa_derive: custom derive support - implementation detail of abscissa_core
  • abscissa_tokio: support for launching Tokio runtimes within Abscissa applications

Minimum Supported Rust Version

Requires Rust 1.60 or newer.

Installation

To generate a new Abscissa application, install the abscissa CLI utility:

$ cargo install abscissa

Creating a new Abscissa application

The following commands will generate an Abscissa application skeleton:

$ cargo install abscissa
$ abscissa new my_cool_app

The resulting app is a Cargo project. The following files are particularly noteworthy:

  • src/application.rs: Abscissa application type for your app
  • src/commands*: application entrypoint and subcommands. Make sure to check out the hello.rs example of how to make a subcommand.
  • src/config.rs: application configuration
  • src/error.rs: error types

Abscissa applications are implemented as Rust libraries, but have a src/bin subdirectory where the binary entrypoint lives. This means you can run the following within your newly generated application:

$ cargo run -- hello world

This will invoke the hello subcommand of your application (you'll probably want to rename that in a real app) which will print the following:

Hello, world!

You can also run the following to print basic help information:

$ cargo run -- --help

Status Macros

// Print a Cargo-like justified status to STDOUT
status_ok!("Loaded", "app loaded successfully");

// Print an error message
status_err!("something bad happened");

// Print an indented attribute to STDOUT
status_attr_ok!("good", "yep");

// Print an error attribute to STDERR
status_attr_err!("error", "yep");

Frequently Asked Questions (FAQ)

Q1: Why is it called "abscissa"?

A1: The word "abscissa" is the key to the Kryptos K2 panel.

Q2: "Abscissa" is a hard name to remember! Got any tips?

A2: Imagine you're A-B testing a couple of scissors... with attitude.

Testing Framework Changes

The main way to test framework changes is by generating an application with Abscissa's built-in application generator and running tests against the generated application (also rustfmt, clippy).

To generate a test application and test it automatically, you can simply do:

$ cargo test

However, when debugging test failures against a generated app, it's helpful to know how to drive the app generation and testing process manually. Below are instructions on how to do so.

If you've already run:

$ git clone https://github.com/iqlusioninc/abscissa/

...and are inside the abscissa directory and want to test your changes, you can generate an application by running the following command:

$ cargo run -- new /tmp/example_app --patch-crates-io='abscissa = { path = "$PWD" }'

This will generate a new Abscissa application in /tmp/example_app which references your local copy of Abscissa.

After that, change directory to the newly generated app and run the tests to ensure things are still working (the tests, along with rustfmt and clippy are run as part of the CI process):

$ cd /tmp/example_app # or 'pushd /tmp/example_app' and 'popd' to return
$ cargo test
$ cargo fmt -- --check # generated app is expected to pass rustfmt
$ cargo clippy

Code of Conduct

We abide by the Contributor Covenant and ask that you do as well.

For more information, please see CODE_OF_CONDUCT.md.

License

The abscissa crate is distributed under the terms of the Apache License (Version 2.0).

Copyright © 2018-2022 iqlusion

Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at

https://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License.

Contribution

If you are interested in contributing to this repository, please make sure to read the CONTRIBUTING.md and CODE_OF_CONDUCT.md files first.

More Repositories

1

crates

A collection of open source Rust crates from iqlusion
Rust
444
star
2

sear

Signed/Encrypted ARchive: always-encrypted tar-like archive tool with optional signature support
Rust
354
star
3

tmkms

Tendermint KMS: Key Management System for Tendermint Validators
Rust
331
star
4

yubikey.rs

Pure Rust YubiKey host-side driver for PIV-based RSA/ECC key storage + signing/encryption support
Rust
218
star
5

cargo-rpm

Cargo subcommand for building .rpm releases of Rust projects
Rust
154
star
6

veriform

Security-oriented protobuf-like serialization format with "Merkleized" content hashing support
Rust
116
star
7

armistice

Hardware private key storage for next-generation cryptography (e.g. BLS) supporting USB armory MkII devices
Rust
110
star
8

synchronicity

Distributed build system providing cryptographic proofs-of-reproducibility via Byzantine Fault Tolerant (BFT) consensus
Rust
92
star
9

liquidity-staking-module

Go
87
star
10

yubihsm.rs

Pure Rust client for YubiHSM2 devices
Rust
64
star
11

usbarmory.rs

Bare metal Rust support for USB armory MkII devices
Rust
58
star
12

keychain-services.rs

Rust access to macOS Keychain Services (experimental)
Rust
57
star
13

cosmon

Sagan is an observability tool for Cosmos and other Tendermint applications
Rust
37
star
14

canister

Deploy self-contained binaries from GCP Container Registry (gcr.io) as systemd service units
Rust
29
star
15

iqkms

Cryptographic key management service providing a gRPC API and support for a variety of key storage methods including YubiHSM2 devices
Rust
15
star
16

delphi

Oracle feeder service (presently supporting Terra)
Rust
14
star
17

LiquidStakingWG

Working group for a standard liquid staking module for Cosmos Chain
HTML
14
star
18

ethereum_hsm_signer

HSM signer via GRPC interface for eth sigs
Rust
5
star
19

0L-iqlusion-engineering-fund

0L Blockchain Engineering fund
2
star
20

iap_proxy

A client side proxy that wraps an http request with Google Identity Aware Proxy
Go
2
star
21

research

Iqlusion Inc research collaboration repo
1
star
22

0l-iqlusion-fulltime-engineering

1
star
23

observatory

CometBFT node monitoring
Rust
1
star