@@ -37,6 +37,8 @@ func describeMermaid(ctx *ExecContext, objectType, name string) error {
3737 return microflowToMermaid (ctx , qn )
3838 case "page" :
3939 return pageToMermaid (ctx , qn )
40+ case "nanoflow" :
41+ return nanoflowToMermaid (ctx , qn )
4042 default :
4143 return mdlerrors .NewUnsupported (fmt .Sprintf ("mermaid format not supported for type: %s" , objectType ))
4244 }
@@ -223,22 +225,56 @@ func microflowToMermaid(ctx *ExecContext, name ast.QualifiedName) error {
223225 return mdlerrors .NewNotFound ("microflow" , name .String ())
224226 }
225227
226- return renderMicroflowMermaid (ctx , targetMf , entityNames )
228+ return renderFlowMermaid (ctx , targetMf . ObjectCollection , entityNames )
227229}
228230
229- // renderMicroflowMermaid renders a microflow as a Mermaid flowchart.
230- func renderMicroflowMermaid (ctx * ExecContext , mf * microflows.Microflow , entityNames map [model.ID ]string ) error {
231+ // nanoflowToMermaid renders a nanoflow as a Mermaid flowchart.
232+ func nanoflowToMermaid (ctx * ExecContext , name ast.QualifiedName ) error {
233+ h , err := getHierarchy (ctx )
234+ if err != nil {
235+ return mdlerrors .NewBackend ("build hierarchy" , err )
236+ }
237+
238+ // Build entity name lookup
239+ entityNames := make (map [model.ID ]string )
240+ domainModels , _ := ctx .Backend .ListDomainModels ()
241+ for _ , dm := range domainModels {
242+ modName := h .GetModuleName (dm .ContainerID )
243+ for _ , entity := range dm .Entities {
244+ entityNames [entity .ID ] = modName + "." + entity .Name
245+ }
246+ }
247+
248+ // Find the nanoflow
249+ allNanoflows , err := ctx .Backend .ListNanoflows ()
250+ if err != nil {
251+ return mdlerrors .NewBackend ("list nanoflows" , err )
252+ }
253+
254+ for _ , nf := range allNanoflows {
255+ modID := h .FindModuleID (nf .ContainerID )
256+ modName := h .GetModuleName (modID )
257+ if modName == name .Module && nf .Name == name .Name {
258+ return renderFlowMermaid (ctx , nf .ObjectCollection , entityNames )
259+ }
260+ }
261+
262+ return mdlerrors .NewNotFound ("nanoflow" , name .String ())
263+ }
264+
265+ // renderFlowMermaid renders a flow's object collection as a Mermaid flowchart.
266+ func renderFlowMermaid (ctx * ExecContext , oc * microflows.MicroflowObjectCollection , entityNames map [model.ID ]string ) error {
231267 var sb strings.Builder
232268 sb .WriteString ("flowchart LR\n " )
233269
234- if mf . ObjectCollection == nil || len (mf . ObjectCollection .Objects ) == 0 {
270+ if oc == nil || len (oc .Objects ) == 0 {
235271 sb .WriteString (" start([Start]) --> stop([End])\n " )
236272 fmt .Fprint (ctx .Output , sb .String ())
237273 return nil
238274 }
239275
240276 // Collect all objects and flows recursively (including nested loop bodies)
241- allObjects , allFlows := collectAllObjectsAndFlows (mf . ObjectCollection )
277+ allObjects , allFlows := collectAllObjectsAndFlows (oc )
242278
243279 // Build activity map and find start event
244280 activityMap := make (map [model.ID ]microflows.MicroflowObject )
0 commit comments