nbparts-0.1.0.0: src/Nbparts/Unpack/Metadata.hs
module Nbparts.Unpack.Metadata where
import Data.Ipynb qualified as Ipynb
import Data.Map qualified as Map
import Data.Maybe qualified as Maybe
import Data.Text (Text)
import Nbparts.Types
( CellMetadata (CodeCellMetadata, GenericCellMetadata),
NotebookMetadata (NotebookMetadata, cells, formatMajor, formatMinor, toplevel),
UnpackError (UnpackMissingCellIdError),
)
extractNotebookVersion :: Ipynb.Notebook a -> (Int, Int)
extractNotebookVersion (Ipynb.Notebook _ format _) = format
collectMetadata :: Ipynb.Notebook a -> Either UnpackError NotebookMetadata
collectMetadata (Ipynb.Notebook toplevelMeta (formatMajor, formatMinor) cells) = do
cellsMetaList <- traverse extractCellMetadata cells
-- Remove empty metadata for compactness.
let filtered = filter (not . isEmptyMeta . snd) cellsMetaList
let cellsMeta = Map.fromList filtered
return NotebookMetadata {formatMajor, formatMinor, toplevel = toplevelMeta, cells = cellsMeta}
isEmptyMeta :: CellMetadata -> Bool
isEmptyMeta (CodeCellMetadata exeCount (Ipynb.JSONMeta meta)) = Maybe.isNothing exeCount && Map.null meta
isEmptyMeta (GenericCellMetadata (Ipynb.JSONMeta meta)) = Map.null meta
extractCellMetadata :: Ipynb.Cell a -> Either UnpackError (Text, CellMetadata)
extractCellMetadata (Ipynb.Cell (Ipynb.Code exeCount _) maybeCellId _ meta _) = case maybeCellId of
Just cellId -> Right (cellId, CodeCellMetadata exeCount meta)
Nothing -> Left UnpackMissingCellIdError
extractCellMetadata (Ipynb.Cell _ maybeCellId _ meta _) = case maybeCellId of
Just cellId -> Right (cellId, GenericCellMetadata meta)
Nothing -> Left UnpackMissingCellIdError