LCOV - code coverage report
Current view: top level - src/services - filter_service.dart (source / functions) Hit Total Coverage
Test: lcov.info Lines: 32 32 100.0 %
Date: 2021-10-28 11:30:47 Functions: 0 0 -

          Line data    Source code
       1             : import 'package:widgetbook/src/models/models.dart';
       2             : 
       3             : class FilterService {
       4          16 :   const FilterService();
       5             : 
       6           1 :   List<Category> filter(
       7             :     String searchTerm,
       8             :     List<Category> categories,
       9             :   ) {
      10           1 :     return _filterCategories(
      11           1 :       RegExp(
      12             :         searchTerm,
      13             :         caseSensitive: false,
      14             :       ),
      15             :       categories,
      16             :     );
      17             :   }
      18             : 
      19           1 :   List<Category> _filterCategories(
      20             :     RegExp regExp,
      21             :     List<Category> categories,
      22             :   ) {
      23           1 :     final matchingOrganizers = <Category>[];
      24           2 :     for (final category in categories) {
      25           1 :       final result = _filterOrganizer(regExp, category) as Category?;
      26           1 :       if (_isMatch(result)) {
      27           1 :         matchingOrganizers.add(result!);
      28             :       }
      29             :     }
      30             :     return matchingOrganizers;
      31             :   }
      32             : 
      33           1 :   ExpandableOrganizer? _filterOrganizer(
      34             :       RegExp regExp, ExpandableOrganizer organizer) {
      35           2 :     if (organizer.name.contains(regExp)) {
      36             :       return organizer;
      37             :     }
      38             : 
      39           1 :     final matchingFolders = <Folder>[];
      40           2 :     for (final subOrganizer in organizer.folders) {
      41           1 :       final result = _filterOrganizer(regExp, subOrganizer);
      42           1 :       if (_isMatch(result)) {
      43           1 :         matchingFolders.add(result! as Folder);
      44             :       }
      45             :     }
      46             : 
      47           1 :     final matchingWidgets = <WidgetElement>[];
      48           2 :     for (final subOrganizer in organizer.widgets) {
      49           1 :       final result = _filterOrganizer(regExp, subOrganizer);
      50           1 :       if (_isMatch(result)) {
      51           1 :         matchingWidgets.add(result! as WidgetElement);
      52             :       }
      53             :     }
      54             : 
      55           2 :     if (matchingFolders.isNotEmpty || matchingWidgets.isNotEmpty) {
      56           1 :       return _createFilteredSubtree(
      57             :         organizer,
      58             :         matchingFolders,
      59             :         matchingWidgets,
      60             :       );
      61             :     }
      62             : 
      63             :     return null;
      64             :   }
      65             : 
      66           1 :   ExpandableOrganizer _createFilteredSubtree(
      67             :     ExpandableOrganizer organizer,
      68             :     List<Folder> folders,
      69             :     List<WidgetElement> widgets,
      70             :   ) {
      71           1 :     if (organizer is Category) {
      72           1 :       return Category(
      73           1 :         name: organizer.name,
      74             :         widgets: widgets,
      75             :         folders: folders,
      76             :       );
      77             :     }
      78             : 
      79             :     // otherwise it can only be a folder
      80           1 :     return Folder(
      81           1 :       name: organizer.name,
      82             :       widgets: widgets,
      83             :       folders: folders,
      84           1 :       isExpanded: organizer.isExpanded,
      85             :     );
      86             :   }
      87             : 
      88           1 :   bool _isMatch(ExpandableOrganizer? organizer) {
      89             :     return organizer != null;
      90             :   }
      91             : }

Generated by: LCOV version 1.15