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}