packages feed

hw-ip-2.4.0.1: app/App/Commands/RangeStats.hs

{-# LANGUAGE DataKinds           #-}
{-# LANGUAGE ScopedTypeVariables #-}
{-# LANGUAGE TypeApplications    #-}

module App.Commands.RangeStats
  ( cmdRangeStats
  ) where

import Control.Lens
import Data.Generics.Product.Any
import Data.Semigroup            ((<>))
import Options.Applicative       hiding (columns)

import qualified App.Commands.Types                 as Z
import qualified HaskellWorks.Data.Network.Ip.Ipv4  as IPv4
import qualified HaskellWorks.Data.Network.Ip.Range as R
import qualified Text.Appar.String                  as AP

{-# ANN module ("HLint: ignore Reduce duplication"  :: String) #-}
{-# ANN module ("HLint: ignore Redundant do"        :: String) #-}

runRangeStats :: Z.RangeStatsOptions -> IO ()
runRangeStats opts =
  print $ length . R.rangeToList $ opts ^. the @"range"

optsRangeStats :: Parser Z.RangeStatsOptions
optsRangeStats = Z.RangeStatsOptions
  <$> option (maybeReader parseRange)
        (   long "range"
        <>  short 'r'
        <>  help "IP Range"
        <>  metavar "RANGE"
        )

parseRange :: String -> Maybe (R.Range IPv4.IpAddress)
parseRange = AP.parse (R.parseRange IPv4.parseIpAddress)

cmdRangeStats :: Mod CommandFields (IO ())
cmdRangeStats = command "range-stats"  $ flip info idm $ runRangeStats <$> optsRangeStats