export class FieldValidationError extends Error {
  override readonly name = 'FieldValidationError'
  constructor(readonly field: string, readonly detail: string) { super(`field invalid: ${field} — ${detail}`) }
}
export class FieldGroupConflictError extends Error {
  override readonly name = 'FieldGroupConflictError'
  constructor(readonly key: string, readonly detail: string) { super(`group conflict: ${key} — ${detail}`) }
}
export class FieldAuthorizationError extends Error {
  override readonly name = 'FieldAuthorizationError'
  constructor(readonly actorId: string, readonly action: string) { super(`actor ${actorId} cannot ${action}`) }
}
export class FieldStoreError extends Error {
  override readonly name = 'FieldStoreError'
  constructor(readonly detail: string) { super(`store error: ${detail}`) }
}

const hasName = (e: unknown, n: string): e is { name: string } =>
  typeof e === 'object' && e !== null && (e as { name?: unknown }).name === n
export const isFieldValidationError = (e: unknown): e is FieldValidationError =>
  hasName(e, 'FieldValidationError') && 'field' in (e as object) && 'detail' in (e as object)
export const isFieldGroupConflictError = (e: unknown): e is FieldGroupConflictError =>
  hasName(e, 'FieldGroupConflictError') && 'key' in (e as object)
export const isFieldAuthorizationError = (e: unknown): e is FieldAuthorizationError =>
  hasName(e, 'FieldAuthorizationError') && 'actorId' in (e as object)
export const isFieldStoreError = (e: unknown): e is FieldStoreError =>
  hasName(e, 'FieldStoreError') && 'detail' in (e as object)
