1 #Region "Microsoft.VisualBasic::679ab956575a21dcdfd03a3f0259dc34, Microsoft.VisualBasic.Core\Language\Value\DefaultValue\DefaultString.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     '     Structure DefaultString
35     
36     '         Properties: DefaultValue, IsEmpty
37     
38     '         Constructor: (+1 OverloadsSub New
39     '         Function: assertIsNothing, LoadJson, LoadXml, ReadAllLines, ToString
40     '         Operators: (+2 OverloadsIsFalse, (+2 OverloadsIsTrue, (+8 OverloadsOr
41     
42     
43     ' /********************************************************************************/
44
45 #End Region
46
47 Imports System.Runtime.CompilerServices
48 Imports Microsoft.VisualBasic.Serialization.JSON
49 Imports CLI = Microsoft.VisualBasic.CommandLine.CommandLine
50
51 Namespace Language.Default
52
53     ''' <summary>
54     ''' <see cref="CLI"/> optional value helper data model
55     ''' </summary>
56     Public Structure DefaultString : Implements IDefaultValue(Of String)
57         Implements IsEmpty
58
59         ''' <summary>
60         ''' The optional argument value that read from <see cref="CLI"/> 
61         ''' </summary>
62         ''' <returns></returns>
63         Public ReadOnly Property DefaultValue As String Implements IDefaultValue(Of String).DefaultValue
64
65         ''' <summary>
66         ''' <see cref="DefaultValue"/> is empty?
67         ''' </summary>
68         ''' <returns></returns>
69         Public ReadOnly Property IsEmpty As Boolean Implements IsEmpty.IsEmpty
70             <MethodImpl(MethodImplOptions.AggressiveInlining)>
71             Get
72                 Return DefaultValue.StringEmpty
73             End Get
74         End Property
75
76         Sub New([string] As String)
77             DefaultValue = [string]
78         End Sub
79
80         <MethodImpl(MethodImplOptions.AggressiveInlining)>
81         Public Function LoadXml(Of T)() As T
82             Return DefaultValue.LoadXml(Of T)
83         End Function
84
85         ''' <summary>
86         ''' 如果文件不存在或者文本内容为空,则函数返回空值
87         ''' </summary>
88         ''' <typeparam name="T"></typeparam>
89         ''' <returns></returns>
90         <MethodImpl(MethodImplOptions.AggressiveInlining)>
91         Public Function LoadJson(Of T)() As T
92             If DefaultValue.FileExists Then
93                 Return DefaultValue.ReadAllText.LoadJSON(Of T)
94             ElseIf DefaultValue.StringEmpty Then
95                 Return Nothing
96             Else
97                 Return DefaultValue.LoadJSON(Of T)
98             End If
99         End Function
100
101         <MethodImpl(MethodImplOptions.AggressiveInlining)>
102         Public Function ReadAllLines() As String()
103             Return DefaultValue.ReadAllLines
104         End Function
105
106         Public Overrides Function ToString() As String
107             Return DefaultValue
108         End Function
109
110         <MethodImpl(MethodImplOptions.AggressiveInlining)>
111         Private Shared Function assertIsNothing(s As StringAs Boolean
112             Return s Is Nothing OrElse String.IsNullOrEmpty(s)
113         End Function
114
115         <MethodImpl(MethodImplOptions.AggressiveInlining)>
116         Public Shared Narrowing Operator CType(str As DefaultString) As Boolean
117             Return str.DefaultValue.ParseBoolean
118         End Operator
119
120         <MethodImpl(MethodImplOptions.AggressiveInlining)>
121         Public Shared Narrowing Operator CType(str As DefaultString) As Integer
122             Return str.DefaultValue.ParseDouble
123         End Operator
124
125         <MethodImpl(MethodImplOptions.AggressiveInlining)>
126         Public Shared Narrowing Operator CType(str As DefaultString) As Double
127             Return str.DefaultValue.ParseDouble
128         End Operator
129
130         <MethodImpl(MethodImplOptions.AggressiveInlining)>
131         Public Shared Narrowing Operator CType(str As DefaultString) As Long
132             Return str.DefaultValue.ParseDouble
133         End Operator
134
135         <MethodImpl(MethodImplOptions.AggressiveInlining)>
136         Public Shared Narrowing Operator CType(str As DefaultString) As Single
137             Return str.DefaultValue.ParseDouble
138         End Operator
139
140         <MethodImpl(MethodImplOptions.AggressiveInlining)>
141         Public Shared Narrowing Operator CType(str As DefaultString) As Short
142             Return str.DefaultValue.ParseDouble
143         End Operator
144
145         <MethodImpl(MethodImplOptions.AggressiveInlining)>
146         Public Shared Widening Operator CType(str As StringAs DefaultString
147             Return New DefaultString(str)
148         End Operator
149
150         <MethodImpl(MethodImplOptions.AggressiveInlining)>
151         Public Shared Operator IsTrue(str As DefaultString) As Boolean
152             Return CType(str, Boolean)
153         End Operator
154
155         <MethodImpl(MethodImplOptions.AggressiveInlining)>
156         Public Shared Operator IsFalse(str As DefaultString) As Boolean
157             Return False = CType(str, Boolean)
158         End Operator
159
160         ''' <summary>
161         ''' If <paramref name="value"/> is empty then returns <paramref name="default"/>, 
162         ''' else returns <paramref name="value"/> itself.
163         ''' </summary>
164         ''' <param name="value"></param>
165         ''' <param name="default$"></param>
166         ''' <returns></returns>
167         Public Shared Operator Or(value As DefaultString, default$) As String
168             If assertIsNothing(value.DefaultValue) Then
169                 Return [default]
170             Else
171                 Return value.DefaultValue
172             End If
173         End Operator
174
175         ''' <summary>
176         ''' Get a <see cref="Integer"/> value or using default <see cref="Integer"/> value.
177         ''' </summary>
178         ''' <param name="value"></param>
179         ''' <param name="x%"></param>
180         ''' <returns></returns>
181         Public Shared Operator Or(value As DefaultString, x%) As Integer
182             Return CInt(value Or CDbl(x))
183         End Operator
184
185         Public Shared Operator Or(value As DefaultString, x#) As Double
186             If assertIsNothing(value.DefaultValue) Then
187                 Return x
188             Else
189                 Return Val(value.DefaultValue)
190             End If
191         End Operator
192
193         <MethodImpl(MethodImplOptions.AggressiveInlining)>
194         Public Shared Operator Or(arg As DefaultString, [default] As DefaultValue(Of String)) As String
195             Return arg.DefaultValue Or [default]
196         End Operator
197
198         <MethodImpl(MethodImplOptions.AggressiveInlining)>
199         Public Shared Narrowing Operator CType(value As DefaultString) As String
200             Return value.DefaultValue
201         End Operator
202
203         <MethodImpl(MethodImplOptions.AggressiveInlining)>
204         Public Shared Operator &(s1 As DefaultString, s2$) As String
205             Return s1.DefaultValue & s2
206         End Operator
207
208         <MethodImpl(MethodImplOptions.AggressiveInlining)>
209         Public Shared Operator &(s1$, s2 As DefaultString) As String
210             Return s1 & s2.DefaultValue
211         End Operator
212     End Structure
213 End Namespace