1+ #[ cfg( feature = "vimdoc" ) ]
2+ pub mod vimdoc;
3+
14pub mod lexer;
25pub mod parser;
36
4- use chumsky:: prelude:: Simple ;
5- use parser:: { Module , Node } ;
67use std:: fmt:: Display ;
78
9+ use chumsky:: prelude:: Simple ;
10+ use parser:: Node ;
11+
812use crate :: lexer:: TagType ;
913
14+ pub trait Nodes {
15+ fn nodes ( & self ) -> & Vec < Node > ;
16+ }
17+
18+ pub trait FromEmmy : Display {
19+ type Settings ;
20+ fn from_emmy ( t : & impl Nodes , s : Self :: Settings ) -> Self ;
21+ }
22+
23+ pub trait AsDoc < T : FromEmmy > {
24+ fn as_doc ( & self , s : T :: Settings ) -> T ;
25+ }
26+
1027#[ derive( Debug , Default ) ]
1128pub struct Rename {
1229 /// Prefix `function` name with `---@mod` name
@@ -22,7 +39,19 @@ pub struct Rename {
2239#[ derive( Debug , Default ) ]
2340pub struct LemmyHelp {
2441 rename : Rename ,
25- pub nodes : Vec < Node > ,
42+ nodes : Vec < Node > ,
43+ }
44+
45+ impl Nodes for LemmyHelp {
46+ fn nodes ( & self ) -> & Vec < Node > {
47+ & self . nodes
48+ }
49+ }
50+
51+ impl < T : FromEmmy > AsDoc < T > for LemmyHelp {
52+ fn as_doc ( & self , s : T :: Settings ) -> T {
53+ T :: from_emmy ( self , s)
54+ }
2655}
2756
2857impl LemmyHelp {
@@ -43,7 +72,9 @@ impl LemmyHelp {
4372 /// Parse given lua source code to generate AST representation
4473 ///
4574 /// ```
46- /// let mut lemmy = lemmy_help::LemmyHelp::default();
75+ /// use lemmy_help::{LemmyHelp, Nodes};
76+ ///
77+ /// let mut lemmy = LemmyHelp::default();
4778 /// let src = r#"
4879 /// local U = {}
4980 ///
@@ -58,7 +89,7 @@ impl LemmyHelp {
5889 /// "#;
5990 ///
6091 /// let ast = lemmy.parse(&src).unwrap();
61- /// assert!(!ast.nodes.is_empty());
92+ /// assert!(!ast.nodes() .is_empty());
6293 /// ```
6394 pub fn parse ( & mut self , src : & str ) -> Result < & Self , Vec < Simple < TagType > > > {
6495 self . nodes . append ( & mut Node :: new ( src) ?) ;
@@ -115,38 +146,3 @@ impl LemmyHelp {
115146 Ok ( self )
116147 }
117148}
118-
119- impl Display for LemmyHelp {
120- fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
121- for node in & self . nodes {
122- if let Node :: Toc ( x) = node {
123- writeln ! (
124- f,
125- "{}" ,
126- Module {
127- name: x. to_string( ) ,
128- desc: Some ( "Table of Contents" . into( ) ) ,
129- }
130- ) ?;
131-
132- for nodde in & self . nodes {
133- if let Node :: Module ( x) = nodde {
134- let desc = x. desc . as_deref ( ) . unwrap_or_default ( ) ;
135-
136- writeln ! (
137- f,
138- "{desc}{}" ,
139- format_args!( "{:·>w$}" , format!( "|{}|" , x. name) , w = 80 - desc. len( ) )
140- ) ?;
141- }
142- }
143-
144- writeln ! ( f) ?;
145- } else {
146- writeln ! ( f, "{node}" ) ?;
147- }
148- }
149-
150- Ok ( ( ) )
151- }
152- }
0 commit comments