export class AnalyticsError extends Error {
  public readonly code: string;

  public constructor(code: string, message: string) {
    super(message);
    this.name = "AnalyticsError";
    this.code = code;
  }
}

export class ValidationError extends AnalyticsError {
  public constructor(message: string) {
    super("VALIDATION_ERROR", message);
    this.name = "ValidationError";
  }
}

export function assertAllowedKeys(input: Record<string, unknown>, allowed: readonly string[]): void {
  const allowedSet = new Set(allowed);
  for (const key of Object.keys(input)) {
    if (!allowedSet.has(key)) {
      throw new ValidationError(`Unknown property: ${key}`);
    }
  }
}
