Line data Source code
1 : import 'dart:collection'; 2 : import 'package:meta/meta.dart'; 3 : import 'package:widgetbook_generator/models/widgetbook_story_data.dart'; 4 : 5 : class Widget { 6 2 : Widget(this.name); 7 : 8 : final String name; 9 : List<WidgetbookStoryData> stories = <WidgetbookStoryData>[]; 10 : } 11 : 12 : @immutable 13 : class Folder { 14 2 : Folder({ 15 : required this.name, 16 : }); 17 : 18 : final String name; 19 : final Map<String, Folder> subFolders = HashMap(); 20 : final Map<String, Widget> widgets = HashMap(); 21 : 22 0 : @override 23 : bool operator ==(Object other) { 24 : if (identical(this, other)) return true; 25 : 26 0 : return other is Folder && other.name == name; 27 : } 28 : 29 0 : @override 30 0 : int get hashCode => name.hashCode; 31 : } 32 : 33 : class TreeService { 34 : Map<String, Folder> folders = HashMap(); 35 : // TODO This is a bit weird but (likely) works 36 : Folder rootFolder = Folder(name: 'root'); 37 : 38 : // Returns the lowest folder in the tree 39 : // might return null if the file is located in lib folder 40 0 : Folder? addFolderByImport( 41 : String import, 42 : ) { 43 0 : var elements = import.split('/').toList(); 44 0 : elements = elements.skip(1).toList(); 45 : // TODO improve 46 : // This skips the last element 47 0 : elements = elements.reversed.skip(1).toList().reversed.toList(); 48 0 : return addFolder(null, elements); 49 : } 50 : 51 0 : void addStoryToFolder( 52 : Folder? folder, 53 : WidgetbookStoryData story, 54 : ) { 55 0 : final widgetName = story.widgetName; 56 : 57 0 : folder ??= rootFolder; 58 : 59 0 : final widgets = folder.widgets; 60 0 : if (!widgets.containsKey(widgetName)) { 61 0 : widgets.putIfAbsent( 62 : widgetName, 63 0 : () => Widget(widgetName), 64 : ); 65 : } 66 : 67 : // TODO do we need to check if a story with that name already exist? 68 : // it might happen by copy and pasting that stories are duplicated. 69 0 : widgets[widgetName]!.stories.add(story); 70 : } 71 : 72 0 : Folder? addFolder(Folder? folder, List<String> paths) { 73 0 : if (paths.isEmpty) { 74 : return folder; 75 : } 76 : 77 0 : final folderName = paths.first; 78 0 : final subFolders = paths.skip(1).toList(); 79 : 80 : if (folder == null) { 81 0 : if (!folders.containsKey(folderName)) { 82 0 : folders.putIfAbsent( 83 : folderName, 84 0 : () => Folder(name: folderName), 85 : ); 86 : } 87 : 88 0 : return addFolder( 89 0 : folders[folderName], 90 : subFolders, 91 : ); 92 : } 93 : // TODO redundant code. needs refactoring. 94 : else { 95 0 : if (!folder.subFolders.containsKey(folderName)) { 96 0 : folder.subFolders.putIfAbsent( 97 : folderName, 98 0 : () => Folder(name: folderName), 99 : ); 100 : } 101 : 102 0 : return addFolder( 103 0 : folder.subFolders[folderName], 104 : subFolders, 105 : ); 106 : } 107 : } 108 : }