packages feed

snippet-0.1.0.3: src/Snippet.hs

-- |
--
-- Module      : Snippet
-- Copyright   : (c) 2026 Patrick Brisbin
-- License     : AGPL-3
-- Maintainer  : pbrisbin@gmail.com
-- Stability   : experimental
-- Portability : POSIX
module Snippet
  ( Region (..)
  , Snippet
  , snippetFromFile
  , snippetFromContents
  ) where

import Prelude

import Data.List.NonEmpty (NonEmpty, nonEmpty)
import Data.Maybe (fromMaybe)
import Data.Text (Text, pack)
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Snippet.Line
import Snippet.Region
import Snippet.Snippet
import System.Directory (doesFileExist)

snippetFromFile :: Region -> FilePath -> IO (Maybe Snippet)
snippetFromFile region path = do
  exists <- doesFileExist path

  if exists
    then do
      contents <- T.readFile path

      let -- Show only the lines of the region
          mSourceLines =
            nonEmpty
              $ drop (sl - 1)
              $ take el
              $ T.lines contents

      pure $ snippetFromContents region (pack path) Nothing <$> mSourceLines
    else pure Nothing
 where
  sl = region.startLine
  el = fromMaybe sl region.endLine

snippetFromContents
  :: Region
  -> Text
  -- ^ URI
  -> Maybe Int
  -- ^ Explicit start line, if not the region's
  -> NonEmpty Text
  -- ^ Code lines
  -> Snippet
snippetFromContents region uri mStartLine sourceLines = do
  Snippet
    { uri
    , region
    , lines = linesFromRegion region mStartLine sourceLines
    }