1 #Region "Microsoft.VisualBasic::e8eebaab4a25fcdee88300088f845699, Microsoft.VisualBasic.Core\CommandLine\Reflection\Grouping.vb"
2
3     ' Author:
4     
5     '       asuka (amethyst.asuka@gcmodeller.org)
6     '       xie (genetics@smrucc.org)
7     '       xieguigang (xie.guigang@live.com)
8     
9     ' Copyright (c) 2018 GPL3 Licensed
10     
11     
12     ' GNU GENERAL PUBLIC LICENSE (GPL3)
13     
14     
15     ' This program is free software: you can redistribute it and/or modify
16     ' it under the terms of the GNU General Public License as published by
17     ' the Free Software Foundation, either version 3 of the License, or
18     ' (at your option) any later version.
19     
20     ' This program is distributed in the hope that it will be useful,
21     ' but WITHOUT ANY WARRANTY; without even the implied warranty of
22     ' MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
23     ' GNU General Public License for more details.
24     
25     ' You should have received a copy of the GNU General Public License
26     ' along with this program. If not, see <http://www.gnu.org/licenses/>.
27
28
29
30     ' /********************************************************************************/
31
32     ' Summaries:
33
34     '     Class Grouping
35     
36     '         Properties: GroupData
37     
38     '         Constructor: (+1 OverloadsSub New
39     '         FunctionGetEnumerator, IEnumerable_GetEnumerator, ToString
40     '         Class Groups
41     
42     '             Properties: Data
43     
44     '             Constructor: (+1 OverloadsSub New
45     
46     
47     
48     
49     ' /********************************************************************************/
50
51 #End Region
52
53 Imports Microsoft.VisualBasic.CommandLine.Reflection
54 Imports Microsoft.VisualBasic.CommandLine.Reflection.EntryPoints
55 Imports Microsoft.VisualBasic.Linq
56 Imports Microsoft.VisualBasic.Scripting.TokenIcer.Prefix
57 Imports Microsoft.VisualBasic.Serialization.JSON
58
59 Namespace CommandLine
60
61     Public Class Grouping : Implements IEnumerable(Of Groups)
62
63         Public Class Groups : Inherits GroupingDefineAttribute
64
65             ''' <summary>
66             ''' 这个分组之中的API列表
67             ''' </summary>
68             ''' <returns></returns>
69             Public Property Data As APIEntryPoint()
70
71             Public Sub New(attr As GroupingDefineAttribute)
72                 MyBase.New(attr.Name)
73
74                 Description = attr.Description
75             End Sub
76         End Class
77
78         Public Property GroupData As Dictionary(Of String, Groups)
79
80         ''' <summary>
81         ''' 
82         ''' </summary>
83         ''' <param name="CLI">
84         ''' 主要是需要从这个类型定义之中得到<see cref="GroupingDefineAttribute"/>数据
85         ''' </param>
86         Sub New(CLI As Interpreter)
87             Dim type As Type = CLI.Type
88             Dim gs = From x As Object
89                      In type.GetCustomAttributes(GetType(GroupingDefineAttribute), True)
90                      Select DirectCast(x, GroupingDefineAttribute)
91             Dim api = (From x As APIEntryPoint
92                        In CLI.APIList
93                        Let g As GroupAttribute() = x.EntryPoint _
94                            .GetCustomAttributes(GetType(GroupAttribute), True) _
95                            .Select(Function(o) DirectCast(o, GroupAttribute)) _
96                            .ToArray
97                        Select If(g.Length = 0, {New GroupAttribute(undefined)}, g) _
98                            .Select(Function(gx) New With {gx, x})) _
99                            .IteratesALL _
100                            .GroupBy(Function(x) x.gx.Name) _
101                            .ToDictionary(Function(x) x.Key,
102                                          Function(x)
103                                              Return x.Select(Function(o) o.x).ToArray
104                                          End Function)
105
106             GroupData = New Dictionary(Of String, Groups)
107
108             For Each g As GroupingDefineAttribute In gs
109                 If api.ContainsKey(g.Name) Then
110                     Dim apiList As APIEntryPoint() = api(g.Name)
111
112                     Call GroupData.Add(
113                         g.Name, New Groups(g) With {
114                             .Data = apiList
115                         })
116                     Call api.Remove(g.Name)
117                 Else
118 #If DEBUG Then
119                     Call $"No data found for grouping {g.GetJson}".Warning
120 #End If
121                 End If
122             Next
123
124             If api.Count > 0 Then
125                 For Each g In api
126                     Dim gK As New GroupingDefineAttribute(g.Key)
127
128                     Call GroupData.Add(
129                         g.Key, New Groups(gK) With {
130                             .Data = g.Value
131                         })
132                 Next
133
134                 Call GroupData.SortByKey
135             End If
136         End Sub
137
138         Public Overrides Function ToString() As String
139             Return GroupData.Keys.ToArray.GetJson
140         End Function
141
142         Public Iterator Function GetEnumerator() As IEnumerator(Of Groups) Implements IEnumerable(Of Groups).GetEnumerator
143             For Each x In GroupData.Values
144                 Yield x
145             Next
146         End Function
147
148         Private Iterator Function IEnumerable_GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
149             Yield GetEnumerator()
150         End Function
151     End Class
152 End Namespace