packages feed

snippet-0.0.0.0: 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)
import Data.Maybe (fromMaybe)
import Data.Text (Text, pack)
import Data.Text qualified as T
import Data.Text.IO qualified as T
import Snippet.Lines
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
      pure $ snippetFromContents region (pack path) contents
    else pure Nothing

snippetFromContents
  :: Region
  -> Text
  -- ^ URI
  -> Text
  -- ^ Code content
  -> Maybe Snippet
snippetFromContents region uri =
  fmap mkSnippet . nonEmpty . drop (sl - 1) . take el . T.lines
 where
  mkSnippet = Snippet uri region . makeLines region
  sl = region.startLine
  el = fromMaybe sl region.endLine