flams/server/lsp.rs
1use flams_database::{DBBackend, DBUser};
2use flams_lsp::{async_lsp::ClientSocket, state::LSPState};
3use flams_router_dashboard::LoginState;
4
5struct WSLSPServer {
6 client: ClientSocket,
7 state: LSPState,
8}
9
10impl flams_lsp::FLAMSLSPServer for WSLSPServer {
11 #[inline]
12 fn client_mut(&mut self) -> &mut ClientSocket {
13 &mut self.client
14 }
15 #[inline]
16 fn client(&self) -> &ClientSocket {
17 &self.client
18 }
19 #[inline]
20 fn state(&self) -> &LSPState {
21 &self.state
22 }
23}
24
25pub(crate) async fn register(
26 auth_session: axum_login::AuthSession<DBBackend>,
27 ws: axum::extract::WebSocketUpgrade,
28) -> axum::response::Response {
29 let login = match &auth_session.backend.admin {
30 None => LoginState::NoAccounts,
31 Some(_) => match auth_session.user {
32 None => LoginState::None,
33 Some(DBUser {
34 id: 0, username, ..
35 }) if username == "admin" => LoginState::Admin,
36 Some(u) => LoginState::User {
37 name: u.username,
38 avatar: u.avatar_url.unwrap_or_default(),
39 is_admin: u.is_admin,
40 },
41 },
42 };
43 match login {
44 LoginState::NoAccounts | LoginState::Admin => flams_lsp::ws::upgrade(ws, |c| WSLSPServer {
45 client: c,
46 state: LSPState::default(),
47 }),
48 _ => {
49 let mut res = axum::response::Response::new(axum::body::Body::empty());
50 *(res.status_mut()) = http::StatusCode::UNAUTHORIZED;
51 res
52 }
53 }
54}
55
56#[tokio::test]
57//#[cfg(test)]
58async fn linter() {
59 /*
60 tracing_subscriber::fmt().init();
61 let _ce = color_eyre::install();
62 let mut spec = flams_system::settings::SettingsSpec::default();
63 spec.lsp = true;
64 flams_system::settings::Settings::initialize(spec);
65 flams_system::backend::GlobalBackend::initialize();
66 //flams_system::initialize(spec);
67 let state = LSPState::default();
68 let _ = GLOBAL_STATE.set(state.clone());
69 tracing::info!("Waiting for stex to load...");
70 std::thread::sleep(std::time::Duration::from_secs(3));
71 tracing::info!("Go!");
72 let (_, t) = measure(move || {
73 tracing::info!("Loading all archives");
74 let mut files = Vec::new();
75 for a in GlobalBackend::get().all_archives().iter() {
76 if let Archive::Local(a) = a {
77 a.with_sources(|d| {
78 for e in <_ as TreeChildIter<SourceDir>>::dfs(d.children.iter()) {
79 match e {
80 SourceEntry::File(f) => files.push((
81 f.relative_path
82 .split('/')
83 .fold(a.source_dir(), |p, s| p.join(s))
84 .into(),
85 DocumentURI::from_archive_relpath(
86 a.uri().owned(),
87 &f.relative_path,
88 ),
89 )),
90 _ => {}
91 }
92 }
93 })
94 }
95 }
96 let len = files.len();
97 tracing::info!("Linting {len} files");
98 state.load_all(
99 files.into_iter(), /*.enumerate().map(|(i,(path,uri))| {
100 tracing::info!("{}/{len}: {}",i+1,path.display());
101 (path,uri)
102 })*/
103 |_, _| {},
104 );
105 });
106 tracing::info!("initialized after {t}");
107 */
108}