use oxc_diagnostics::{
    miette::{self, Diagnostic},
    thiserror::{self, Error},
};
use oxc_macros::declare_oxc_lint;
use oxc_span::Span;

use crate::{context::LintContext, rule::Rule, AstNode};

#[derive(Debug, Error, Diagnostic)]
#[error("{{plugin_name}}({{kebab_rule_name}}):")]
#[diagnostic(severity(warning), help(""))]
struct {{pascal_rule_name}}Diagnostic(#[label] pub Span);

#[derive(Debug, Default, Clone)]
pub struct {{pascal_rule_name}};

declare_oxc_lint!(
    /// ### What it does
    ///
    ///
    /// ### Why is this bad?
    ///
    ///
    /// ### Example
    /// ```javascript
    /// ```
    {{pascal_rule_name}},
    correctness
);

impl Rule for {{pascal_rule_name}} {
    fn run<'a>(&self, node: &AstNode<'a>, ctx: &LintContext<'a>) {

    }
}

#[test]
fn test() {
    use crate::tester::Tester;

    let pass = vec![
        {{pass_cases}}
    ];

    let fail = vec![
        {{fail_cases}}
    ];

    Tester::new({{pascal_rule_name}}::NAME, pass, fail).test_and_snapshot();
}
