use anyhow::Result;
use crate::errors::Suggestion;
use crate::lint::checks::offset_plane::start_sketch_on_check_specific_plane;
use crate::lint::rule::Discovered;
use crate::lint::rule::Finding;
use crate::lint::rule::FindingFamily;
use crate::lint::rule::def_finding;
use crate::parsing::ast::types::Node as AstNode;
use crate::parsing::ast::types::Program;
use crate::walk::Node;
def_finding!(
Z0002,
"default plane should be called versus explicitly defined",
"\
startSketchOn should be a default plane in this case ✏️
The startSketchOn stdlib function has the ability to define a default Plane
to begin the sketch on.
These are the default planes: XY, -XY, XZ, -XZ, YZ, -YZ.
",
FindingFamily::Simplify
);
pub fn lint_should_be_default_plane(node: Node, _prog: &AstNode<Program>) -> Result<Vec<Discovered>> {
let Some((call_source_range, plane_name, offset)) = start_sketch_on_check_specific_plane(node)? else {
return Ok(vec![]);
};
if offset != 0.0 {
return Ok(vec![]);
}
let suggestion = Suggestion {
title: "use defaultPlane instead".to_owned(),
insert: format!("{plane_name}"),
source_range: call_source_range,
};
Ok(vec![Z0002.at(
format!("custom plane in startSketchOn; defaultPlane {plane_name} would work here"),
call_source_range,
Some(suggestion),
)])
}
#[cfg(test)]
mod tests {
use super::Z0002;
use super::lint_should_be_default_plane;
use crate::lint::rule::test_finding;
use crate::lint::rule::test_no_finding;
test_finding!(
z0002_bad_sketch_on,
lint_should_be_default_plane,
Z0002,
"\
startSketchOn({
origin = { x = 0, y = 0, z = 0 },
xAxis = { x = 1, y = 0, z = 0 },
yAxis = { x = 0, y = 0, z = 1 },
})
|> startProfile(at = [0, 0])
",
"custom plane in startSketchOn; defaultPlane XZ would work here",
Some("XZ".to_string())
);
test_no_finding!(
z0002_good_sketch_on,
lint_should_be_default_plane,
Z0002,
"\
startSketchOn({
origin = { x = 10, y = -14.3, z = 0 },
xAxis = { x = 1, y = 0, z = 0 },
yAxis = { x = 0, y = 0, z = 1 },
})
"
);
test_no_finding!(
z0002_offset_plane,
lint_should_be_default_plane,
Z0002,
"\
startSketchOn({
origin = { x = 0, y = -14.3, z = 0 },
xAxis = { x = 1, y = 0, z = 0 },
yAxis = { x = 0, y = 0, z = 1 },
})
"
);
}