use biome_rowan::FileSourceError;
use biome_string_case::StrLikeExtension;
use std::{ffi::OsStr, path::Path};
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(
Debug, Clone, Default, Copy, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize,
)]
pub struct CssFileSource {
#[allow(unused)]
variant: CssVariant,
}
#[cfg_attr(feature = "schema", derive(schemars::JsonSchema))]
#[derive(
Debug, Clone, Default, Copy, Eq, PartialEq, Hash, serde::Serialize, serde::Deserialize,
)]
enum CssVariant {
#[default]
Standard,
}
impl CssFileSource {
pub fn css() -> Self {
Self {
variant: CssVariant::Standard,
}
}
pub fn try_from_well_known(_: &Path) -> Result<Self, FileSourceError> {
Err(FileSourceError::UnknownFileName)
}
pub fn try_from_extension(extension: &OsStr) -> Result<Self, FileSourceError> {
match extension.as_encoded_bytes() {
b"css" => Ok(Self::css()),
_ => Err(FileSourceError::UnknownExtension),
}
}
pub fn try_from_language_id(language_id: &str) -> Result<Self, FileSourceError> {
match language_id {
"css" => Ok(Self::css()),
_ => Err(FileSourceError::UnknownLanguageId),
}
}
}
impl TryFrom<&Path> for CssFileSource {
type Error = FileSourceError;
fn try_from(path: &Path) -> Result<Self, Self::Error> {
if let Ok(file_source) = Self::try_from_well_known(path) {
return Ok(file_source);
}
let Some(extension) = path.extension() else {
return Err(FileSourceError::MissingFileExtension);
};
Self::try_from_extension(&extension.to_ascii_lowercase_cow())
}
}