packages feed

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