ditto/packages/utils/PleromaConfigDB.ts
2025-02-17 15:32:18 -06:00

67 lines
1.9 KiB
TypeScript

import type { ElixirTuple, ElixirValue, PleromaConfig } from '@/schemas/pleroma-api.ts';
export class PleromaConfigDB {
constructor(private configs: PleromaConfig[]) {}
get(group: string, key: string): PleromaConfig | undefined {
return this.configs.find((c) => c.group === group && c.key === key);
}
getIn(group: string, key: string, ...paths: string[]): ElixirValue | undefined {
const config = this.get(group, key);
if (!config) return undefined;
let value = config.value;
for (const path of paths) {
if (Array.isArray(value)) {
const tuple = value.find((item): item is ElixirTuple => {
return PleromaConfigDB.isTuple(item) && item.tuple[0] === path;
});
if (tuple) {
value = tuple.tuple[1];
} else {
return;
}
} else if (PleromaConfigDB.isTuple(value) && value.tuple[0] === path) {
value = value.tuple[1];
} else if (!PleromaConfigDB.isTuple(value) && value && typeof value === 'object' && path in value) {
value = value[path];
} else {
return;
}
}
return value;
}
set(group: string, key: string, value: PleromaConfig): void {
const index = this.configs.findIndex((c) => c.group === group && c.key === key);
if (index === -1) {
this.configs.push(value);
} else {
this.configs[index] = value;
}
}
merge(configs: PleromaConfig[]): void {
for (const { group, key, value } of configs) {
this.set(group, key, { group, key, value });
}
}
toJSON(): PleromaConfig[] {
return this.configs;
}
private static isTuple(value: ElixirValue): value is ElixirTuple {
return Boolean(
value &&
typeof value === 'object' &&
'tuple' in value &&
Array.isArray(value.tuple) &&
value.tuple.length === 2 &&
typeof value.tuple[0] === 'string',
);
}
}