A snippet extractor for competitive programmers.
This allows you to manage your code snippets with tests and benchmarks available !!
You need to install rustfmt
to run cargo-snippet
.
$ rustup component add rustfmt
Install cargo-snippet
$ cargo install cargo-snippet --features="binaries"
Create a project for snippet.
$ cargo new --lib mysnippet
Add dependencies to Cargo.toml.
[dependencies]
cargo-snippet = "0.6"
Note: cargo-snippet
on dependencies is needed just for register #[snippet]
attribute to prevent the error from the compiler.
All logics that extract snippet is in the binary package which is installed by Installing
section.
Then write some snippet codes and tests.
use cargo_snippet::snippet;
// Annotate snippet name
#[snippet("mymath")]
#[snippet("gcd")]
fn gcd(a: u64, b: u64) -> u64 {
if b == 0 {
a
} else {
gcd(b, a % b)
}
}
// Also works
#[snippet(name = "mymath")]
// Equivalent to #[snippet("lcm")]
#[snippet]
fn lcm(a: u64, b: u64) -> u64 {
a / gcd(a, b) * b
}
#[snippet]
// Include snippet
#[snippet(include = "gcd")]
fn gcd_list(list: &[u64]) -> u64 {
list.iter().fold(list[0], |a, &b| gcd(a, b))
}
// You can set prefix string.
// Note: All codes will be formatted by rustfmt on output
#[snippet(prefix = "use std::io::{self,Read};")]
#[snippet(prefix = "use std::str::FromStr;")]
fn foo() {}
// By default, doc comments associated with items will be output with the snippet.
#[snippet]
/// This is a document!
fn documented() {
//! Inner document also works.
}
// If you want doc comment to be hidden, append `doc_hidden` keyword.
#[snippet(doc_hidden, prefix = "use std::collections::HashMap;")]
/// This is a doc comment for `bar`.
/// Since `doc_hidden` is specified, it won't be present in the snippet.
fn bar() {
//! And this is also a doc comment for `bar`, which will be removed.
}
#[test]
fn test_gcd() {
assert_eq!(gcd(57, 3), 3);
}
#[test]
fn test_lcm() {
assert_eq!(lcm(3, 19), 57);
}
You can test as always:
$ cargo test
Extract snippet !
$ cargo snippet
snippet foo
use std::io::{self, Read};
use std::str::FromStr;
fn foo() {}
snippet documented
/// This is a document!
fn documented() {
//! Inner document also works.
}
snippet bar
use std::collections::HashMap;
fn bar() {}
snippet gcd
fn gcd(a: u64, b: u64) -> u64 {
if b == 0 {
a
} else {
gcd(b, a % b)
}
}
snippet gcd_list
fn gcd(a: u64, b: u64) -> u64 {
if b == 0 {
a
} else {
gcd(b, a % b)
}
}
fn gcd_list(list: &[u64]) -> u64 {
list.iter().fold(list[0], |a, &b| gcd(a, b))
}
snippet lcm
fn lcm(a: u64, b: u64) -> u64 {
a / gcd(a, b) * b
}
snippet mymath
fn gcd(a: u64, b: u64) -> u64 {
if b == 0 {
a
} else {
gcd(b, a % b)
}
}
fn lcm(a: u64, b: u64) -> u64 {
a / gcd(a, b) * b
}
My snippets here.
- Neosnippet
- VScode
- Ultisnips
You can specify output format via -t
option.
See cargo snippet -h
.