use crate::schema::Schema;
use async_trait::async_trait;
use tower_lsp::lsp_types::{CompletionItem, Diagnostic, Hover, Location, Position};
#[async_trait]
pub trait Dialect: Send + Sync {
fn name(&self) -> &str;
async fn parse(&self, sql: &str, schema: Option<&Schema>) -> Vec<Diagnostic>;
async fn completion(
&self,
sql: &str,
position: Position,
schema: Option<&Schema>,
) -> Vec<CompletionItem>;
async fn hover(&self, sql: &str, position: Position, schema: Option<&Schema>) -> Option<Hover>;
async fn goto_definition(
&self,
sql: &str,
position: Position,
schema: Option<&Schema>,
) -> Option<Location>;
async fn references(
&self,
sql: &str,
position: Position,
schema: Option<&Schema>,
) -> Vec<Location>;
async fn format(&self, sql: &str) -> String;
async fn validate(&self, sql: &str, schema: Option<&Schema>) -> Vec<Diagnostic>;
}