%
'=======================================================================================================================
' IO Helpers
'=======================================================================================================================
Sub put(v)
Select Case typename(v)
Case "LinkedList_Class" : response.write join(v.TO_Array, ", ")
Case "DynamicArray_Class" : response.write JoinList(v)
Case "Variant()" : response.write join(v, ", ")
Case else : response.write v
End Select
End Sub
Sub put_
put "
"
End Sub
Sub putl(v)
put v
put_
End Sub
'accepts anything that can have an iterator, including lists, arrays, and recordsets
Sub putlist(col, prefix, suffix)
dim it : set it = IteratorFor(col)
Do While it.HasNext
put prefix & it.GetNext & suffix
Loop
End Sub
'same as join() for arrays, but for any arbitrary collection
Function JoinList(col)
dim s : s = ""
dim it : set it = IteratorFor(col)
Do While it.HasNext
s = s & ", "
Loop
JoinList = Left(s, Len(s) - 2)
End Function
'---------------------------------------------------------------------------------------------------------------------
'Wrapper for Server.HTMLEncode() -- makes it easier on the eyes when reading the HTML code
Function H(s)
If Not IsEmpty(s) and Not IsNull(s) then
H = Server.HTMLEncode(s)
Else
H = ""
End If
End Function
'-----------------------------------------------------------------------------------------------------------------------
'allows tracing of output on demand without interfering with layout
Sub trace(s)
comment s
End Sub
'-----------------------------------------------------------------------------------------------------------------------
'outputs an HTML comment, useful for tracing etc
Sub Comment(text)
response.write vbcrlf & vbcrlf & "" & vbcrlf & vbcrlf
End Sub
'-----------------------------------------------------------------------------------------------------------------------
'pseudo-design-by-contract capability, allows strong-typing of methods and views
Sub ExpectType(obj_type, obj)
if typename(obj) <> obj_type then Err.Raise 1, "lib.Helpers:ExpectType", "View expected object of type '" & obj_type & "' but received type '" & typename(obj) & "'."
End Sub
'=======================================================================================================================
' Dump* functions for dumping variables, objects, lists, etc for debugging purposes
'=======================================================================================================================
Class DataDumper_Class
Public Sub Dump(V)
put "
"
DumpIt V
put ""
End Sub
Private m_indent
Private Sub Indent
m_indent = m_indent + 1
'putl "INDENT: " & m_indent
'puti m_indent
'put_
End Sub
Private Sub Dedent
m_indent = m_indent - 1
'putl "INDENT: " & m_indent
End Sub
Private Sub Class_Initialize
m_indent = -1 'first indent takes it to 0
End Sub
'prepends indents
Private Sub puti(v)
put Spaces(m_indent) & v
End Sub
Private Sub DumpIt(V)
If Typename(V) = "LinkedList_Class" then
DumpList V
ElseIf Instr(Typename(V), "_Class") > 0 then
DumpClass V
ElseIf Typename(V) = "Variant()" then
DumpArray V
ElseIf Typename(V) = "Recordset" then
DumpRecordset V
Else
put "«" & H(V) & "»"
End If
End Sub
Private Sub DumpList(V)
Indent
dim it : set it = V.Iterator
dim item
dim i : i = 1
put_
puti "[List:" & vbCR
While it.HasNext
Indent
set item = it.GetNext()
puti i & " => "
DumpIt item
put_
Dedent
i = i + 1
Wend
puti "]"
Dedent
End Sub
Private Sub DumpArray(V)
Indent
dim i
put_
puti "[Array:" & vbCR
Indent
For i = 0 to UBound(V)
puti i & " => "
DumpIt V(i)
put_
Next
Dedent
puti "]"
Dedent
End Sub
Private Sub DumpClass(C)
Indent
dim i
put_
puti "{" & Typename(C) & ": " & vbCR
Indent
On Error Resume Next
If Ubound(C.Class_Get_Properties) > 0 then
dim property_name, the_property
For i = 0 to UBound(C.Class_Get_Properties)
property_name = C.Class_Get_Properties(i)
Execute "Assign the_property, C." & C.Class_Get_Properties(i)
'put "property_name: " & property_name & " (" & typename(the_property) & ")" & vbCR
If typename(the_property) = "LinkedList_Class" then
puti " " & property_name & " : LinkedList_Class => "
DumpList(the_property)
ElseIf InStr(typename(the_property), "_Class") then
puti " " & property_name & " : " & typename(the_property) & " => "
DumpClass(the_property)
Else
puti " " & property_name & " : " & typename(the_property) & " => " '& Eval("C." & property_name)
DumpIt(the_property)
If i <> UBound(C.Class_Get_Properties) then put ", "
put vbCR
End If
Next
Else
End If
On Error Goto 0
Dedent
puti "}" & vbCR & vbCR
Dedent
End Sub
Sub DumpRecordset(R)
Indent
dim field
put "| " & field.Name & " | " Next put "
|---|
| " & H(R(field.Name)) & " | " Next put "