use crate::prelude::*;
use crate::FormatJsonSyntaxToken;
use biome_formatter::separated::{
FormatSeparatedElementRule, FormatSeparatedIter, TrailingSeparator,
};
use biome_formatter::FormatRefWithRule;
use biome_json_syntax::{JsonLanguage, JsonSyntaxToken};
use biome_rowan::{AstNode, AstSeparatedList, AstSeparatedListElementsIterator};
use std::marker::PhantomData;
#[derive(Clone)]
pub(crate) struct JsonFormatSeparatedElementRule<N> {
node: PhantomData<N>,
}
impl<N> FormatSeparatedElementRule<N> for JsonFormatSeparatedElementRule<N>
where
N: AstNode<Language = JsonLanguage> + AsFormat<JsonFormatContext> + 'static,
{
type Context = JsonFormatContext;
type FormatNode<'a> = N::Format<'a>;
type FormatSeparator<'a> = FormatRefWithRule<'a, JsonSyntaxToken, FormatJsonSyntaxToken>;
fn format_node<'a>(&self, node: &'a N) -> Self::FormatNode<'a> {
node.format()
}
fn format_separator<'a>(&self, separator: &'a JsonSyntaxToken) -> Self::FormatSeparator<'a> {
separator.format()
}
}
type JsonFormatSeparatedIter<Node> = FormatSeparatedIter<
AstSeparatedListElementsIterator<JsonLanguage, Node>,
Node,
JsonFormatSeparatedElementRule<Node>,
>;
pub(crate) trait FormatAstSeparatedListExtension:
AstSeparatedList<Language = JsonLanguage>
{
fn format_separated(&self, separator: &'static str) -> JsonFormatSeparatedIter<Self::Node> {
JsonFormatSeparatedIter::new(
self.elements(),
separator,
JsonFormatSeparatedElementRule { node: PhantomData },
)
.with_trailing_separator(TrailingSeparator::Disallowed)
}
}
impl<T> FormatAstSeparatedListExtension for T where T: AstSeparatedList<Language = JsonLanguage> {}