Crates.io | marker_api |
lib.rs | marker_api |
version | 0.5.0 |
source | src |
created_at | 2022-11-04 10:36:37.175279 |
updated_at | 2023-12-28 21:03:18.247232 |
description | Marker's API, designed for stability and usability |
homepage | |
repository | https://github.com/rust-marker/marker |
max_upload_size | |
id | 705007 |
size | 329,508 |
marker_api provides a representation of the AST and all connected types needed to create custom lint crates for Marker, an experimental linting interface for Rust.
Note
Marker is in the early stages of development, some things are still missing and the API still unstable.
A list of limitations and planned features can be found in Marker's Readme.
This section will cover how you can set up your own lint crate. If you only want to run custom lints, checkout Marker's CLI interface cargo_marker. The rest of the section assumes that you have cargo_marker installed.
The simplest way to get started, is to use Marker's lint crate template, which already includes all dependencies, example code, and a working test setup.
To get started, create a new Rust crate that compiles to a library (cargo init --lib
). Afterwards, edit the Cargo.toml
to compile the crate to a dynamic library and include marker_api
as a dependency. You can simply add the following to your Cargo.toml
file:
[lib]
crate-type = ["cdylib"]
[dependencies]
marker_api = "0.5.0"
marker_utils = "0.5.0"
The lint crate needs to provide an implementation of the LintPass
trait and call the marker_api::export_lint_pass
macro with the implementing type. Here is the minimal template:
use marker_api::prelude::*;
use marker_api::{LintPass, LintPassInfo, LintPassInfoBuilder};
// This is the struct that will implement the `LintPass` trait.
#[derive(Default)]
struct MyLintPass;
// This macro allow Marker to load the lint crate. Only one lint pass can be
// exported per lint crate.
marker_api::export_lint_pass!(MyLintPass);
// This macro declares a new lint, that can later be emitted
marker_api::declare_lint! {
/// # What it does
/// Here you can explain what your lint does. The description supports normal
/// markdown.
///
/// # Example
/// ```rs
/// // Bad example
/// ```
///
/// Use instead:
/// ```rs
/// // Good example
/// ```
MY_LINT,
Warn,
}
// This is the actual `LintPass` implementation, which will be called by Marker.
impl LintPass for MyLintPass {
fn info(&self) -> LintPassInfo {
LintPassInfoBuilder::new(Box::new([MY_LINT])).build()
}
}
Now you can implement different check_*
function in the LintPass
trait.
To automatically test your lints, you might want to check out the marker_uitest crate.
And that's it. Happy linting!
Contributions are highly appreciated! If you encounter any issues or have suggestions for improvements, please check out Marker's GitHub repository.
Copyright (c) 2022-2023 Rust-Marker
Rust-Marker is distributed under the terms of the MIT license or the Apache License (Version 2.0).
See LICENSE-APACHE, LICENSE-MIT.