1 #Region "Microsoft.VisualBasic::23ba87ac9ada3062a24b7accc453a396, Microsoft.VisualBasic.Core\Language\Language\Perl\die.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 ExceptionHandler
35     
36     '         Function: [Default]
37     '         Operators: (+2 OverloadsOr
38     
39     
40     ' /********************************************************************************/
41
42 #End Region
43
44 Imports System.Drawing
45 Imports Microsoft.VisualBasic.Emit.Delegates
46 Imports Microsoft.VisualBasic.Language.Default
47 Imports Microsoft.VisualBasic.Linq
48
49 Namespace Language.Perl
50
51     Public Structure ExceptionHandler
52
53         Dim Message$
54         Dim failure As Assert(Of Object)
55
56         Shared ReadOnly defaultHandler As New Assert(Of Object)(AddressOf [Default])
57
58         ''' <summary>
59         ''' ReturnTrue means test failure
60         ''' </summary>
61         ''' <param name="obj"></param>
62         ''' <returns></returns>
63         Public Shared Function [Default](obj As ObjectAs Boolean
64             If obj Is Nothing Then
65                 Return True
66             End If
67
68             Select Case obj.GetType
69                 Case GetType(Boolean)
70                     Return False = DirectCast(obj, Boolean)
71
72                     ' 对于字符串而言,判断是否为空的标准则是看字符串是否为空或者空字符串
73                 Case GetType(String)
74                     Return String.IsNullOrEmpty(DirectCast(obj, String))
75
76                 Case GetType(Double)
77                     Return CDbl(obj).IsNaNImaginary
78
79                 Case GetType(TimeSpan)
80                     Return DirectCast(obj, TimeSpan) = TimeSpan.Zero
81
82                 Case GetType(Color)
83                     Return DirectCast(obj, Color).IsEmpty
84
85                 Case GetType(Rectangle)
86                     Return DirectCast(obj, Rectangle).IsEmpty
87
88                 Case GetType(RectangleF)
89                     Return DirectCast(obj, RectangleF).IsEmpty
90
91                 Case GetType(Point)
92                     Return DirectCast(obj, Point).IsEmpty
93
94                 Case GetType(PointF)
95                     Return DirectCast(obj, PointF).IsEmpty
96
97                 Case Else
98
99                     With obj.GetType
100                         If .IsInheritsFrom(GetType(Array)) Then
101                             Return DirectCast(obj, Array).Length = 0
102
103                         ElseIf .ImplementInterface(GetType(IEnumerable)) Then
104                             Return (From o In DirectCast(obj, IEnumerable).AsQueryable).Count = 0
105
106                         ElseIf .ImplementInterface(GetType(IsEmpty)) Then
107                             Return DirectCast(obj, IsEmpty).IsEmpty
108
109                         Else
110                             Return False False表示没有错误
111                         End If
112                     End With
113             End Select
114         End Function
115
116         ''' <summary>
117         ''' Perl like exception handler syntax for testing the result is failure or not?
118         ''' </summary>
119         ''' <param name="result"></param>
120         ''' <param name="h"></param>
121         ''' <returns></returns>
122         Public Shared Operator Or(result As Object, h As ExceptionHandler) As Object
123             If h.failure(result) Then
124                 Throw New Exception(h.Message)
125             Else
126                 Return result
127             End If
128         End Operator
129     End Structure
130 End Namespace