Page Menu
Home
Sealhub
Search
Configure Global Search
Log In
Files
F3011005
structured.ts
No One
Temporary
Actions
Download File
Edit File
Delete File
View Transforms
Subscribe
Mute Notifications
Award Token
Flag For Later
Size
3 KB
Referenced Files
None
Subscribers
None
structured.ts
View Options
import
{
is
,
predicates
}
from
"@sealcode/ts-predicates"
;
import
{
JDDContext
}
from
"../index.js"
;
import
{
ComponentArgument
,
ExtractParsed
,
ExtractStorage
,
}
from
"./component-argument.js"
;
import
{
ContainerArgument
}
from
"./container-argument.js"
;
export
class
Structured
<
T
extends
Record
<
string
,
ComponentArgument
<
unknown
>>
>
extends
ContainerArgument
<
{
[
property
in
keyof
T
]
:
ExtractParsed
<
T
[
property
]
>
;
},
{
[
property
in
keyof
T
]
:
ExtractStorage
<
T
[
property
]
>
;
}
>
{
constructor
(
public
structure
:
T
)
{
super
();
Object
.
values
(
structure
).
forEach
((
arg
)
=>
(
arg
.
parent_argument
=
this
));
}
getTypeName
()
{
return
"structured"
;
}
getSubArgument
(
[
key
,
...
rest
]
:
string
[],
value
:
{
[
property
in
keyof
T
]
:
ExtractParsed
<
T
[
property
]
>
;
}
// eslint-disable-next-line @typescript-eslint/no-explicit-any
)
:
readonly
[
ComponentArgument
<
any
>
|
null
,
string
[],
unknown
]
{
return
<
const
>
[
this
.
structure
[
key
]
||
null
,
rest
,
value
[
key
]];
}
countWords
(
value
:
{
[
property
in
keyof
T
]
:
ExtractParsed
<
T
[
property
]
>
;
})
:
number
{
return
Object
.
entries
(
value
).
reduce
((
acc
,
[
key
,
val
])
=>
{
if
(
!
this
.
structure
[
key
])
{
console
.
warn
(
`Key
${
key
}
doesn't exist in structured argument`
);
return
acc
+
0
;
}
return
acc
+
this
.
structure
[
key
].
countWords
(
val
);
},
0
);
}
async
getEmptyValue
(
context
:
JDDContext
)
:
Promise
<
{
[
property
in
keyof
T
]
:
ExtractParsed
<
T
[
property
]
>
;
}
>
{
return
Object
.
fromEntries
(
await
Promise
.
all
(
Object
.
entries
(
this
.
structure
).
map
(
async
([
name
,
arg
])
=>
[
name
,
await
arg
.
getEmptyValue
(
context
),
])
)
)
as
{
[
property
in
keyof
T
]
:
ExtractParsed
<
T
[
property
]
>
;
};
}
async
getExampleValue
(
context
:
JDDContext
)
{
return
Object
.
fromEntries
(
await
Promise
.
all
(
Object
.
entries
(
this
.
structure
).
map
(
async
([
name
,
arg
])
=>
[
name
,
await
arg
.
getExampleValue
(
context
),
])
)
)
as
{
[
property
in
keyof
T
]
:
ExtractParsed
<
T
[
property
]
>
;
};
}
async
processAllSubarguments
<
SingleObject
extends
{
[
property
in
keyof
T
]
:
ExtractParsed
<
T
[
property
]
>
;
}
>
(
_context
:
JDDContext
,
input
:
unknown
,
processing_function
:
(
argument
:
ComponentArgument
<
unknown
>
,
value
:
unknown
)
=>
Promise
<
unknown
>
)
:
Promise
<
SingleObject
|
SingleObject
[]
|
null
>
{
if
(
!
is
(
input
,
predicates
.
object
))
{
throw
new
Error
(
`Not an object:
${
input
as
string
}
`
);
}
const
result
:
Record
<
string
,
unknown
>
=
{};
await
Promise
.
all
(
Object
.
entries
(
input
).
map
(
async
([
obj_key
,
obj_value
])
=>
{
const
nested_arg_type
:
ComponentArgument
<
unknown
>
=
this
.
structure
[
obj_key
];
if
(
!
nested_arg_type
)
{
return
[
obj_key
,
null
];
}
const
new_value
=
await
processing_function
(
nested_arg_type
,
obj_value
);
result
[
obj_key
]
=
new_value
;
})
);
// if we're in a list and any of the values return an array, we will multiply the object
if
(
this
.
hasParent
(
"list"
))
{
const
keys_with_unexpected_arrays
=
Object
.
entries
(
result
)
.
filter
(([
key
,
value
])
=>
{
const
nested_arg_type
:
ComponentArgument
<
unknown
>
=
this
.
structure
[
key
];
return
(
nested_arg_type
.
getTypeName
()
!==
"list"
&&
Array
.
isArray
(
value
)
);
})
.
map
(([
key
])
=>
key
);
if
(
keys_with_unexpected_arrays
.
length
>
1
)
{
throw
new
Error
(
"Multiplying on more than one field at the same time is not implemented yet"
);
}
if
(
keys_with_unexpected_arrays
.
length
==
1
)
{
const
key
=
keys_with_unexpected_arrays
[
0
];
const
old_result
=
result
;
const
array
=
old_result
[
key
];
if
(
!
Array
.
isArray
(
array
))
{
throw
new
Error
(
"expected an array"
);
}
return
array
.
map
((
value
:
unknown
)
=>
({
...
old_result
,
[
key
]
:
value
,
}))
as
SingleObject
[];
}
else
{
return
result
as
SingleObject
;
}
}
else
{
return
result
as
SingleObject
;
}
}
}
File Metadata
Details
Attached
Mime Type
text/x-Algol68
Expires
Wed, May 7, 19:51 (17 h, 51 m)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
629231
Default Alt Text
structured.ts (3 KB)
Attached To
Mode
rJDD jdd
Attached
Detach File
Event Timeline
Log In to Comment