1use crate::clangd::ClangdUtility;
2
3use griff::ChunkStream;
4
5#[derive(Debug, Clone, Default)]
6#[repr(u8)]
7pub enum SourceFlags {
8 #[default]
9 None,
10
11 IsTU = 1 << 0,
12 HadErrors = 1 << 1,
13}
14impl From<u8> for SourceFlags {
15 fn from(b: u8) -> Self {
16 use SourceFlags::*;
17 match b {
18 1 => IsTU,
19 2 => HadErrors,
20 _ => None,
21 }
22 }
23}
24
25#[derive(Clone, Debug, Default)]
26pub struct Srcs {
27 pub flags: SourceFlags,
28 pub uri: String,
29 pub digest: [u8; 8],
30 pub direct_includes: Vec<String>,
31
32}
33impl ClangdUtility for Srcs{}
34
35impl Srcs {
36 #[allow(dead_code)]
37 pub fn parse(stream: &ChunkStream, string_table: &Vec<String>) -> Vec<Srcs> {
38 let mut cursor: usize = 0;
39 let mut idx: u32;
40 let _data = stream.data.clone();
41 let data = _data.as_slice();
42 let mut srcs: Vec<Srcs> = vec![];
43 if data.len() == 0 {
44 return srcs;
45 }
46
47 loop {
48 let mut src: Srcs = Default::default();
49 src.flags = SourceFlags::from(data[cursor]);
50 cursor += 1;
51 let (sz, content) = Self::get_string(data.get(cursor..).unwrap(), string_table);
52 src.uri = content;
53 cursor += sz;
54 src.digest = data.get(cursor..cursor+8).unwrap().try_into().unwrap();
55 cursor += 8;
56 let (sz, len) = Self::get_varint(data.get(cursor..).unwrap());
57 cursor += sz;
58 idx = 0;
59 while idx < len {
60 let (sz, content) = Self::get_string(data.get(cursor..).unwrap(), string_table);
61 src.direct_includes.push(content);
62 cursor += sz;
63 idx += 1;
64 }
65 srcs.push(src);
66
67 if cursor >= data.len() {
68 break;
69 }
70 }
71 srcs
72 }
73}