cargo_gazelle/
rules.rs
1use std::collections::BTreeSet;
11
12use crate::{QuotedString, ToBazelDefinition};
13
14#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
16pub enum Rule {
17 RustLibrary,
18 RustProcMacro,
19 RustTest,
20 RustDocTest,
21 RustBinary,
22 CargoBuildScript,
23 ExtractCargoLints,
24 }
29
30impl Rule {
31 pub fn module(&self) -> Module {
32 match self {
33 Rule::RustLibrary
34 | Rule::RustProcMacro
35 | Rule::RustTest
36 | Rule::RustDocTest
37 | Rule::RustBinary => Module::Rust,
38 Rule::CargoBuildScript | Rule::ExtractCargoLints => Module::Cargo,
39 }
40 }
41}
42
43impl ToBazelDefinition for Rule {
44 fn format(&self, writer: &mut dyn std::fmt::Write) -> Result<(), std::fmt::Error> {
45 let s = match self {
46 Rule::RustLibrary => "rust_library",
47 Rule::RustProcMacro => "rust_proc_macro",
48 Rule::RustTest => "rust_test",
49 Rule::RustDocTest => "rust_doc_test",
50 Rule::RustBinary => "rust_binary",
51 Rule::CargoBuildScript => "cargo_build_script",
52 Rule::ExtractCargoLints => "extract_cargo_lints",
53 };
54 let s = QuotedString::new(s);
55 s.format(writer)
56 }
57}
58
59#[derive(Debug, PartialEq, Eq, PartialOrd, Ord)]
62pub enum Module {
63 Rust,
64 Cargo,
65}
66
67impl ToBazelDefinition for Module {
68 fn format(&self, writer: &mut dyn std::fmt::Write) -> Result<(), std::fmt::Error> {
69 let s = match self {
70 Module::Rust => "rust",
71 Module::Cargo => "cargo",
72 };
73 write!(writer, "{s}")
74 }
75}
76
77#[derive(Debug)]
78pub struct LoadStatement {
79 module: Module,
80 rules: BTreeSet<Rule>,
81}
82
83impl ToBazelDefinition for LoadStatement {
84 fn format(&self, writer: &mut dyn std::fmt::Write) -> Result<(), std::fmt::Error> {
85 write!(
86 writer,
87 "load(\"@rules_rust//{}:defs.bzl\"",
88 self.module.to_bazel_definition()
89 )?;
90 for rule in &self.rules {
91 write!(writer, ", {}", rule.to_bazel_definition())?;
92 }
93 write!(writer, ")")?;
94
95 Ok(())
96 }
97}
98
99impl From<(Module, Vec<Rule>)> for LoadStatement {
100 fn from(value: (Module, Vec<Rule>)) -> Self {
101 let rules = value.1.into_iter().collect();
102 LoadStatement {
103 module: value.0,
104 rules,
105 }
106 }
107}