Default Database
The default
crate provides default components for managing source files and a database in the db module:
- BaseDb: A basic database implementation using Salsa.
- File: A struct representing a source file.
- BaseDatabase: A trait for file retrieval.
- FileManager: A trait for file updates.
These components are designed to cover common use cases but can be extended or replaced to suit your project’s specific needs.
File struct
The File struct is a salsa::input
representing a source file, its Url
, and a reference to its parser configuration.
#[salsa::input]
pub struct File {
#[id]
pub url: Url,
pub parsers: &'static Parsers,
#[return_ref]
pub document: Arc<Document>,
}
BaseDb struct
BaseDb
is the default implementation of a database. It stores File inputs.
#![allow(unused)] fn main() { #[salsa::db] #[derive(Default, Clone)] pub struct BaseDb { storage: Storage<Self>, pub(crate) files: DashMap<Url, File>, } }
To enable logging, use the with_logger
method to initialize the database with a logger closure.
BaseDatabase trait
The BaseDatabase
trait defines how to access stored files. It's meant to be implemented by any Salsa-compatible database. It is used to retrieve files from the database.
#[salsa::db]
pub trait BaseDatabase: Database {
fn get_files(&self) -> &DashMap<Url, File>;
fn get_file(&self, url: &Url) -> Option<File> {
self.get_files().get(url).map(|file| *file)
}
}
FileManager trait
The FileManager
trait provides high-level methods to manage files (add, update, remove). It is implemented for any type that also implements BaseDatabase
.
pub trait FileManager: BaseDatabase + salsa::Database {
fn add_file_from_texter(
&mut self,
parsers: &'static Parsers,
url: &Url,
texter: Text,
) -> Result<(), DataBaseError>;
fn update(
&mut self,
url: &Url,
changes: &[lsp_types::TextDocumentContentChangeEvent],
) -> Result<(), DataBaseError>;
fn remove_file(&mut self, url: &Url) -> Result<(), DataBaseError>;
}