Skip to main content

microcad_lang/parse/
doc_block.rs

1// Copyright © 2025-2026 The µcad authors <info@ucad.xyz>
2// SPDX-License-Identifier: AGPL-3.0-or-later
3
4use crate::{parse::*, parser::*, syntax::DocBlock};
5use microcad_syntax::ast;
6
7impl FromAst for DocBlock {
8    type AstNode = ast::Comment;
9
10    fn from_ast(node: &Self::AstNode, context: &ParseContext) -> Result<Self, ParseError> {
11        let (summary, details) =
12            if let Some(line_num) = node.lines.iter().position(|line| line.trim().is_empty()) {
13                (
14                    join_parts(&node.lines[0..line_num]),
15                    Some(join_parts(&node.lines[line_num..])),
16                )
17            } else {
18                (node.lines.clone().join("\n"), None)
19            };
20
21        Ok(DocBlock {
22            summary,
23            details,
24            src_ref: context.src_ref(&node.span),
25        })
26    }
27}
28
29fn join_parts(parts: &[String]) -> String {
30    let mut result = String::with_capacity(64);
31    for part in parts {
32        result.push_str(part);
33    }
34    result
35}