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.
 
 

62 lines
2.2 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 rows<OutputT extends object = object, 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 extends object = object, 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 extends object = object, 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;
}