-- SPDX-FileCopyrightText: 2026 Alexandra de Wit
--
-- SPDX-License-Identifier: MIT

{- | Artifact coordinates inside one source snapshot.
Adapters assign keys before admission. Assembly combines them with the snapshot and winning source.
-}
module Ecluse.Core.Package.Entry (
    EntryKey (..),
    AdmittedEntry (..),
) where

import Ecluse.Core.Snapshot (ContentDigest)

-- | A raw entry's coordinate, independent of its declared artifact filename.
data EntryKey
    = -- | A zero-based position in the original array, before any entry drops.
      ArrayEntry Int
    | -- | The exact key in the original object, before normalisation.
      ObjectEntry Text
    | -- | A snapshot that contains only one artifact entry.
      SingletonEntry
    deriving stock (EntryKey -> EntryKey -> Bool
(EntryKey -> EntryKey -> Bool)
-> (EntryKey -> EntryKey -> Bool) -> Eq EntryKey
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: EntryKey -> EntryKey -> Bool
== :: EntryKey -> EntryKey -> Bool
$c/= :: EntryKey -> EntryKey -> Bool
/= :: EntryKey -> EntryKey -> Bool
Eq, Eq EntryKey
Eq EntryKey =>
(EntryKey -> EntryKey -> Ordering)
-> (EntryKey -> EntryKey -> Bool)
-> (EntryKey -> EntryKey -> Bool)
-> (EntryKey -> EntryKey -> Bool)
-> (EntryKey -> EntryKey -> Bool)
-> (EntryKey -> EntryKey -> EntryKey)
-> (EntryKey -> EntryKey -> EntryKey)
-> Ord EntryKey
EntryKey -> EntryKey -> Bool
EntryKey -> EntryKey -> Ordering
EntryKey -> EntryKey -> EntryKey
forall a.
Eq a =>
(a -> a -> Ordering)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> Bool)
-> (a -> a -> a)
-> (a -> a -> a)
-> Ord a
$ccompare :: EntryKey -> EntryKey -> Ordering
compare :: EntryKey -> EntryKey -> Ordering
$c< :: EntryKey -> EntryKey -> Bool
< :: EntryKey -> EntryKey -> Bool
$c<= :: EntryKey -> EntryKey -> Bool
<= :: EntryKey -> EntryKey -> Bool
$c> :: EntryKey -> EntryKey -> Bool
> :: EntryKey -> EntryKey -> Bool
$c>= :: EntryKey -> EntryKey -> Bool
>= :: EntryKey -> EntryKey -> Bool
$cmax :: EntryKey -> EntryKey -> EntryKey
max :: EntryKey -> EntryKey -> EntryKey
$cmin :: EntryKey -> EntryKey -> EntryKey
min :: EntryKey -> EntryKey -> EntryKey
Ord, Int -> EntryKey -> ShowS
[EntryKey] -> ShowS
EntryKey -> String
(Int -> EntryKey -> ShowS)
-> (EntryKey -> String) -> ([EntryKey] -> ShowS) -> Show EntryKey
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> EntryKey -> ShowS
showsPrec :: Int -> EntryKey -> ShowS
$cshow :: EntryKey -> String
show :: EntryKey -> String
$cshowList :: [EntryKey] -> ShowS
showList :: [EntryKey] -> ShowS
Show)

-- | The admitted coordinate and filename, without retaining the artifact's other metadata.
data AdmittedEntry = AdmittedEntry
    { AdmittedEntry -> ContentDigest
admittedSnapshot :: ContentDigest
    , AdmittedEntry -> EntryKey
admittedKey :: EntryKey
    , AdmittedEntry -> Text
admittedFilename :: Text
    }
    deriving stock (AdmittedEntry -> AdmittedEntry -> Bool
(AdmittedEntry -> AdmittedEntry -> Bool)
-> (AdmittedEntry -> AdmittedEntry -> Bool) -> Eq AdmittedEntry
forall a. (a -> a -> Bool) -> (a -> a -> Bool) -> Eq a
$c== :: AdmittedEntry -> AdmittedEntry -> Bool
== :: AdmittedEntry -> AdmittedEntry -> Bool
$c/= :: AdmittedEntry -> AdmittedEntry -> Bool
/= :: AdmittedEntry -> AdmittedEntry -> Bool
Eq, Int -> AdmittedEntry -> ShowS
[AdmittedEntry] -> ShowS
AdmittedEntry -> String
(Int -> AdmittedEntry -> ShowS)
-> (AdmittedEntry -> String)
-> ([AdmittedEntry] -> ShowS)
-> Show AdmittedEntry
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
$cshowsPrec :: Int -> AdmittedEntry -> ShowS
showsPrec :: Int -> AdmittedEntry -> ShowS
$cshow :: AdmittedEntry -> String
show :: AdmittedEntry -> String
$cshowList :: [AdmittedEntry] -> ShowS
showList :: [AdmittedEntry] -> ShowS
Show)