Scenario generator for vore roleplay and story ideas.
https://scenario-generator.deliciousreya.net/responses
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
export function jsonParser<OutputT extends object = object, KeysT extends keyof OutputT = keyof OutputT, InputT extends { readonly [key in KeysT]: string } = { readonly [key in KeysT]: string }>(keys: readonly KeysT[]): (value: InputT) => Pick<OutputT, KeysT> {
|
|
const keysCopy = keys.slice()
|
|
return (value) => {
|
|
const result: Partial<Pick<OutputT, KeysT>> = {}
|
|
for (const key of keysCopy) {
|
|
result[key] = JSON.parse(value[key])
|
|
}
|
|
return result as Pick<OutputT, KeysT>
|
|
}
|
|
}
|
|
|
|
export function extract<ValueT, KeyT extends string = string, ObjectT extends {[value in KeyT]: ValueT} = {[value in KeyT]: ValueT}>(key: KeyT): (value: ObjectT) => ObjectT[KeyT] {
|
|
return (value) => value[key]
|
|
}
|
|
|
|
export function rows<OutputT, InputT extends object = object>(transformer?: (value: InputT) => OutputT): (result: D1Result<object>) => OutputT[] {
|
|
if (transformer) {
|
|
return (result) => (result.results as InputT[]).map(transformer)
|
|
} else {
|
|
return (result) => result.results as OutputT[];
|
|
}
|
|
}
|
|
|
|
export function guaranteedSingleton<OutputT, InputT extends object = object>(transformer?: (value: InputT) => OutputT): (result: D1Result<object>) => OutputT {
|
|
const inner = singleton<OutputT, InputT>(transformer)
|
|
|
|
return (result) => {
|
|
const out = inner(result)
|
|
if (out === null) {
|
|
throw Error('expected exactly one result but got none')
|
|
}
|
|
return out
|
|
}
|
|
}
|
|
|
|
export function singleton<OutputT, InputT extends object = object>(transformer?: (value: InputT) => OutputT): (result: D1Result<object>) => OutputT | null {
|
|
if (transformer) {
|
|
return (result) => {
|
|
if (result.results.length > 1) {
|
|
throw Error(`expected single result but got ${result.results.length}`);
|
|
}
|
|
const resultRow = result.results[0] as InputT|undefined
|
|
return resultRow ? transformer(resultRow) : null;
|
|
};
|
|
} else {
|
|
return (result) => {
|
|
if (result.results.length > 1) {
|
|
throw Error(`expected single result but got ${result.results.length}`);
|
|
}
|
|
const resultRow = result.results[0] as OutputT|undefined
|
|
return resultRow ?? null;
|
|
};
|
|
}
|
|
}
|
|
|
|
export function nothing(): (result: D1Result) => void {
|
|
return (result) => {
|
|
if (result.results.length > 0) {
|
|
throw Error(`expected no results but got ${result.results.length}`);
|
|
}
|
|
};
|
|
}
|
|
|
|
export function writeCount(): (result: D1Result) => number {
|
|
return (result) => result.meta.rows_written;
|
|
}
|
|
|