1 #Region "Microsoft.VisualBasic::0f8cdd5dad1e4211deb96927ae8d1543, 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, ToString
40     '         Operators: (+2 OverloadsIsFalse, (+2 OverloadsIsTrue, (+6 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.LoadObject(Of T)
94             ElseIf DefaultValue.StringEmpty Then
95                 Return Nothing
96             Else
97                 Return DefaultValue.LoadObject(Of T)
98             End If
99         End Function
100
101         Public Overrides Function ToString() As String
102             Return DefaultValue
103         End Function
104
105         <MethodImpl(MethodImplOptions.AggressiveInlining)>
106         Private Shared Function assertIsNothing(s As StringAs Boolean
107             Return s Is Nothing OrElse String.IsNullOrEmpty(s)
108         End Function
109
110         <MethodImpl(MethodImplOptions.AggressiveInlining)>
111         Public Shared Narrowing Operator CType(str As DefaultString) As Boolean
112             Return str.DefaultValue.ParseBoolean
113         End Operator
114
115         <MethodImpl(MethodImplOptions.AggressiveInlining)>
116         Public Shared Narrowing Operator CType(str As DefaultString) As Integer
117             Return str.DefaultValue.ParseDouble
118         End Operator
119
120         <MethodImpl(MethodImplOptions.AggressiveInlining)>
121         Public Shared Narrowing Operator CType(str As DefaultString) As Double
122             Return str.DefaultValue.ParseDouble
123         End Operator
124
125         <MethodImpl(MethodImplOptions.AggressiveInlining)>
126         Public Shared Narrowing Operator CType(str As DefaultString) As Long
127             Return str.DefaultValue.ParseDouble
128         End Operator
129
130         <MethodImpl(MethodImplOptions.AggressiveInlining)>
131         Public Shared Narrowing Operator CType(str As DefaultString) As Single
132             Return str.DefaultValue.ParseDouble
133         End Operator
134
135         <MethodImpl(MethodImplOptions.AggressiveInlining)>
136         Public Shared Narrowing Operator CType(str As DefaultString) As Short
137             Return str.DefaultValue.ParseDouble
138         End Operator
139
140         <MethodImpl(MethodImplOptions.AggressiveInlining)>
141         Public Shared Widening Operator CType(str As StringAs DefaultString
142             Return New DefaultString(str)
143         End Operator
144
145         <MethodImpl(MethodImplOptions.AggressiveInlining)>
146         Public Shared Operator IsTrue(str As DefaultString) As Boolean
147             Return CType(str, Boolean)
148         End Operator
149
150         <MethodImpl(MethodImplOptions.AggressiveInlining)>
151         Public Shared Operator IsFalse(str As DefaultString) As Boolean
152             Return False = CType(str, Boolean)
153         End Operator
154
155         ''' <summary>
156         ''' If <paramref name="value"/> is empty then returns <paramref name="default"/>, else returns <paramref name="value"/> itself.
157         ''' </summary>
158         ''' <param name="value"></param>
159         ''' <param name="default$"></param>
160         ''' <returns></returns>
161         Public Shared Operator Or(value As DefaultString, default$) As String
162             If assertIsNothing(value.DefaultValue) Then
163                 Return [default]
164             Else
165                 Return value.DefaultValue
166             End If
167         End Operator
168
169         Public Shared Operator Or(value As DefaultString, x%) As Integer
170             Return CInt(value Or CDbl(x))
171         End Operator
172
173         Public Shared Operator Or(value As DefaultString, x#) As Double
174             If assertIsNothing(value.DefaultValue) Then
175                 Return x
176             Else
177                 Return Val(value.DefaultValue)
178             End If
179         End Operator
180
181         <MethodImpl(MethodImplOptions.AggressiveInlining)>
182         Public Shared Narrowing Operator CType(value As DefaultString) As String
183             Return value.DefaultValue
184         End Operator
185
186         <MethodImpl(MethodImplOptions.AggressiveInlining)>
187         Public Shared Operator &(s1 As DefaultString, s2$) As String
188             Return s1.DefaultValue & s2
189         End Operator
190
191         <MethodImpl(MethodImplOptions.AggressiveInlining)>
192         Public Shared Operator &(s1$, s2 As DefaultString) As String
193             Return s1 & s2.DefaultValue
194         End Operator
195     End Structure
196 End Namespace