{-# LANGUAGE DeriveGeneric #-}
{-# LANGUAGE FlexibleInstances #-}
{-# LANGUAGE TypeOperators #-}

-- | A module to retrieve os-release information according to the
-- freedesktop standard:
-- https://www.freedesktop.org/software/systemd/man/os-release.html
--
-- Usage example:
--
-- @
-- do
--   Just (OsRelease {..}) <- fmap osRelease <$\> parseOsRelease
--   putStrLn name
-- @
module System.OsRelease
  (
  -- * data types
    OsReleaseResult(..)
  , OsRelease(..)

  -- * read/parse os-release
  , parseOsRelease
  , readOsRelease

  -- * defaults
  , defaultOsRelease
  , defaultAssignments

  -- * low-level
  , parseAssignments
  , parseAssignment
  , getAllAssignments
  , getOsRelease
  , parseOsRelease'
  )
where

import           System.OsRelease.Megaparsec

import           Control.Applicative
import           Control.Monad
import           Control.Exception.Safe
import           Data.Aeson
import           Data.Aeson.TH
import           Data.Char
import           Data.Either
import           Data.List
import           Data.Maybe
import           Data.Void
import           GHC.Generics
import           Prelude                 hiding ( id
                                                )

import qualified Data.HashMap.Strict           as HM
import qualified Data.Text                     as T
import qualified Text.Megaparsec               as MP


data OsReleaseResult = OsReleaseResult {
    OsReleaseResult -> OsRelease
osRelease :: !OsRelease
  , OsReleaseResult -> [(String, String)]
unknown_fields :: [(String, String)]
  , OsReleaseResult -> [ParseError String Void]
parse_errors :: [MP.ParseError String Void]
} deriving (Int -> OsReleaseResult -> ShowS
[OsReleaseResult] -> ShowS
OsReleaseResult -> String
(Int -> OsReleaseResult -> ShowS)
-> (OsReleaseResult -> String)
-> ([OsReleaseResult] -> ShowS)
-> Show OsReleaseResult
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OsReleaseResult] -> ShowS
$cshowList :: [OsReleaseResult] -> ShowS
show :: OsReleaseResult -> String
$cshow :: OsReleaseResult -> String
showsPrec :: Int -> OsReleaseResult -> ShowS
$cshowsPrec :: Int -> OsReleaseResult -> ShowS
Show)


-- | All the explicitly documented fields of @os-release@.
data OsRelease = OsRelease {
    OsRelease -> String
name :: !(String)
  , OsRelease -> Maybe String
version :: !(Maybe String)
  , OsRelease -> String
id :: !(String)
  , OsRelease -> Maybe String
id_like :: !(Maybe String)
  , OsRelease -> Maybe String
version_codename :: !(Maybe String)
  , OsRelease -> Maybe String
version_id :: !(Maybe String)
  , OsRelease -> String
pretty_name :: !(String)
  , OsRelease -> Maybe String
ansi_color :: !(Maybe String)
  , OsRelease -> Maybe String
cpe_name :: !(Maybe String)
  , OsRelease -> Maybe String
home_url :: !(Maybe String)
  , OsRelease -> Maybe String
documentation_url :: !(Maybe String)
  , OsRelease -> Maybe String
support_url :: !(Maybe String)
  , OsRelease -> Maybe String
bug_report_url :: !(Maybe String)
  , OsRelease -> Maybe String
privacy_policy_url :: !(Maybe String)
  , OsRelease -> Maybe String
build_id :: !(Maybe String)
  , OsRelease -> Maybe String
variant :: !(Maybe String)
  , OsRelease -> Maybe String
variant_id :: !(Maybe String)
  ,  :: !(Maybe String)
} deriving ((forall x. OsRelease -> Rep OsRelease x)
-> (forall x. Rep OsRelease x -> OsRelease) -> Generic OsRelease
forall x. Rep OsRelease x -> OsRelease
forall x. OsRelease -> Rep OsRelease x
forall a.
(forall x. a -> Rep a x) -> (forall x. Rep a x -> a) -> Generic a
$cto :: forall x. Rep OsRelease x -> OsRelease
$cfrom :: forall x. OsRelease -> Rep OsRelease x
Generic, Int -> OsRelease -> ShowS
[OsRelease] -> ShowS
OsRelease -> String
(Int -> OsRelease -> ShowS)
-> (OsRelease -> String)
-> ([OsRelease] -> ShowS)
-> Show OsRelease
forall a.
(Int -> a -> ShowS) -> (a -> String) -> ([a] -> ShowS) -> Show a
showList :: [OsRelease] -> ShowS
$cshowList :: [OsRelease] -> ShowS
show :: OsRelease -> String
$cshow :: OsRelease -> String
showsPrec :: Int -> OsRelease -> ShowS
$cshowsPrec :: Int -> OsRelease -> ShowS
Show)

deriveJSON defaultOptions ''OsRelease

class GetRecords a where
  getRecords :: a -> [String]

instance {-# OVERLAPPABLE #-} GetRecords (f p) => GetRecords (M1 i c f p) where
  getRecords :: M1 i c f p -> [String]
getRecords (M1 f p
x) = f p -> [String]
forall a. GetRecords a => a -> [String]
getRecords f p
x

instance {-# OVERLAPPING #-} Selector c => GetRecords (M1 S c f p) where
  getRecords :: M1 S c f p -> [String]
getRecords M1 S c f p
x = [M1 S c f p -> String
forall k (s :: k) k1 (t :: k -> (k1 -> *) -> k1 -> *)
       (f :: k1 -> *) (a :: k1).
Selector s =>
t s f a -> String
selName M1 S c f p
x]

instance (GetRecords (a p), GetRecords (b p)) => GetRecords ((a :*: b) p) where
  getRecords :: (:*:) a b p -> [String]
getRecords (a p
a :*: b p
b) = a p -> [String]
forall a. GetRecords a => a -> [String]
getRecords a p
a [String] -> [String] -> [String]
forall a. [a] -> [a] -> [a]
++ b p -> [String]
forall a. GetRecords a => a -> [String]
getRecords b p
b



-- | The defaults as per the spec:
--
-- @
-- NAME=Linux
-- ID=linux
-- PRETTY_NAME=Linux
-- @
defaultOsRelease :: OsRelease
defaultOsRelease :: OsRelease
defaultOsRelease = OsRelease :: String
-> Maybe String
-> String
-> Maybe String
-> Maybe String
-> Maybe String
-> String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> Maybe String
-> OsRelease
OsRelease { name :: String
name               = String
"Linux"
                             , version :: Maybe String
version            = Maybe String
forall a. Maybe a
Nothing
                             , id :: String
id                 = String
"linux"
                             , id_like :: Maybe String
id_like            = Maybe String
forall a. Maybe a
Nothing
                             , version_codename :: Maybe String
version_codename   = Maybe String
forall a. Maybe a
Nothing
                             , version_id :: Maybe String
version_id         = Maybe String
forall a. Maybe a
Nothing
                             , pretty_name :: String
pretty_name        = String
"Linux"
                             , ansi_color :: Maybe String
ansi_color         = Maybe String
forall a. Maybe a
Nothing
                             , cpe_name :: Maybe String
cpe_name           = Maybe String
forall a. Maybe a
Nothing
                             , home_url :: Maybe String
home_url           = Maybe String
forall a. Maybe a
Nothing
                             , documentation_url :: Maybe String
documentation_url  = Maybe String
forall a. Maybe a
Nothing
                             , support_url :: Maybe String
support_url        = Maybe String
forall a. Maybe a
Nothing
                             , bug_report_url :: Maybe String
bug_report_url     = Maybe String
forall a. Maybe a
Nothing
                             , privacy_policy_url :: Maybe String
privacy_policy_url = Maybe String
forall a. Maybe a
Nothing
                             , build_id :: Maybe String
build_id           = Maybe String
forall a. Maybe a
Nothing
                             , variant :: Maybe String
variant            = Maybe String
forall a. Maybe a
Nothing
                             , variant_id :: Maybe String
variant_id         = Maybe String
forall a. Maybe a
Nothing
                             , logo :: Maybe String
logo               = Maybe String
forall a. Maybe a
Nothing
                             }

-- | Like `defaultOsRelease`, except as key-value pair.
defaultAssignments :: [(String, String)]
defaultAssignments :: [(String, String)]
defaultAssignments =
  [(String
"NAME", String
"Linux"), (String
"ID", String
"linux"), (String
"PRETTY_NAME", String
"Linux")]


-- | Get all allAssignments as @(key, val)@ from the @os-release@
-- file contents.
getAllAssignments :: String  -- ^ file contents of os-release
                  -> [Either (MP.ParseError String Void) (String, String)]
getAllAssignments :: String -> [Either (ParseError String Void) (String, String)]
getAllAssignments = (ParseErrorBundle String Void
 -> [Either (ParseError String Void) (String, String)])
-> ([Either (ParseError String Void) (String, String)]
    -> [Either (ParseError String Void) (String, String)])
-> Either
     (ParseErrorBundle String Void)
     [Either (ParseError String Void) (String, String)]
-> [Either (ParseError String Void) (String, String)]
forall a c b. (a -> c) -> (b -> c) -> Either a b -> c
either ([Either (ParseError String Void) (String, String)]
-> ParseErrorBundle String Void
-> [Either (ParseError String Void) (String, String)]
forall a b. a -> b -> a
const []) (\[Either (ParseError String Void) (String, String)]
x -> [Either (ParseError String Void) (String, String)]
x) (Either
   (ParseErrorBundle String Void)
   [Either (ParseError String Void) (String, String)]
 -> [Either (ParseError String Void) (String, String)])
-> (String
    -> Either
         (ParseErrorBundle String Void)
         [Either (ParseError String Void) (String, String)])
-> String
-> [Either (ParseError String Void) (String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Parsec
  Void String [Either (ParseError String Void) (String, String)]
-> String
-> String
-> Either
     (ParseErrorBundle String Void)
     [Either (ParseError String Void) (String, String)]
forall e s a.
Parsec e s a -> String -> s -> Either (ParseErrorBundle s e) a
MP.parse Parsec
  Void String [Either (ParseError String Void) (String, String)]
parseAssignments String
"os-release"


-- | Parse the assignments into `OsRelease`. This is merged with the
-- defaults as per the spec. In case of no assignments, also returns
-- the defaults.
getOsRelease :: [(String, String)]  -- ^ assignments
             -> OsRelease
getOsRelease :: [(String, String)] -> OsRelease
getOsRelease =
  (\case
      Error   String
_ -> OsRelease
defaultOsRelease
      Success OsRelease
v -> OsRelease
v
    )
    (Result OsRelease -> OsRelease)
-> ([(String, String)] -> Result OsRelease)
-> [(String, String)]
-> OsRelease
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Value -> Result OsRelease
forall a. FromJSON a => Value -> Result a
fromJSON
    (Value -> Result OsRelease)
-> ([(String, String)] -> Value)
-> [(String, String)]
-> Result OsRelease
forall b c a. (b -> c) -> (a -> b) -> a -> c
. Object -> Value
Object
    (Object -> Value)
-> ([(String, String)] -> Object) -> [(String, String)] -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (\Object
x -> Object -> Object -> Object
forall k v.
(Eq k, Hashable k) =>
HashMap k v -> HashMap k v -> HashMap k v
HM.union Object
x ([(Text, Value)] -> Object
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList ([(Text, Value)] -> Object)
-> ([(String, String)] -> [(Text, Value)])
-> [(String, String)]
-> Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(String, String)] -> [(Text, Value)]
aesonify ([(String, String)] -> Object) -> [(String, String)] -> Object
forall a b. (a -> b) -> a -> b
$ [(String, String)]
defaultAssignments))
    (Object -> Object)
-> ([(String, String)] -> Object) -> [(String, String)] -> Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(Text, Value)] -> Object
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList
    ([(Text, Value)] -> Object)
-> ([(String, String)] -> [(Text, Value)])
-> [(String, String)]
-> Object
forall b c a. (b -> c) -> (a -> b) -> a -> c
. [(String, String)] -> [(Text, Value)]
aesonify
 where
  aesonify :: [(String, String)] -> [(Text, Value)]
aesonify = ((String, String) -> (Text, Value))
-> [(String, String)] -> [(Text, Value)]
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (\(String
k, String
v) -> (Text -> Text
T.toLower (Text -> Text) -> (String -> Text) -> String -> Text
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Text) -> String -> Text
forall a b. (a -> b) -> a -> b
$ String
k, Text -> Value
String (Text -> Value) -> (String -> Text) -> String -> Value
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> Text
T.pack (String -> Value) -> String -> Value
forall a b. (a -> b) -> a -> b
$ String
v))


-- | Tries to read @\"\/etc\/os-release\"@ and @\"\/usr\/lib\/os_release\"@ in order.
--
-- Throws @IOError@ if both files could not be read.
readOsRelease :: IO String
readOsRelease :: IO String
readOsRelease = String -> IO String
readFile String
"/etc/os-release" IO String -> IO String -> IO String
forall (f :: * -> *) a. Alternative f => f a -> f a -> f a
<|> String -> IO String
readFile String
"/usr/lib/os-release"


-- | Tries to read @\"\/etc\/os-release\"@ and @\"\/usr\/lib\/os_release\"@ in order
-- and parses into `OsReleaseResult`. Returns @Nothing@ if both files could
-- not be read.
parseOsRelease :: IO (Maybe OsReleaseResult)
parseOsRelease :: IO (Maybe OsReleaseResult)
parseOsRelease =
  (IOException -> IO (Maybe OsReleaseResult))
-> IO (Maybe OsReleaseResult) -> IO (Maybe OsReleaseResult)
forall (m :: * -> *) a.
MonadCatch m =>
(IOException -> m a) -> m a -> m a
handleIO (\IOException
_ -> Maybe OsReleaseResult -> IO (Maybe OsReleaseResult)
forall (f :: * -> *) a. Applicative f => a -> f a
pure Maybe OsReleaseResult
forall a. Maybe a
Nothing) (IO (Maybe OsReleaseResult) -> IO (Maybe OsReleaseResult))
-> (IO String -> IO (Maybe OsReleaseResult))
-> IO String
-> IO (Maybe OsReleaseResult)
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> Maybe OsReleaseResult)
-> IO String -> IO (Maybe OsReleaseResult)
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap (OsReleaseResult -> Maybe OsReleaseResult
forall a. a -> Maybe a
Just (OsReleaseResult -> Maybe OsReleaseResult)
-> (String -> OsReleaseResult) -> String -> Maybe OsReleaseResult
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> OsReleaseResult
parseOsRelease') (IO String -> IO (Maybe OsReleaseResult))
-> IO String -> IO (Maybe OsReleaseResult)
forall a b. (a -> b) -> a -> b
$ IO String
readOsRelease


-- | Like `parseOsRelease`, except taking the input String explicitly.
-- Primarily for tests.
parseOsRelease' :: String -> OsReleaseResult
parseOsRelease' :: String -> OsReleaseResult
parseOsRelease' String
s =
  let ([ParseError String Void]
errs, [(String, String)]
ass) = [Either (ParseError String Void) (String, String)]
-> ([ParseError String Void], [(String, String)])
forall a b. [Either a b] -> ([a], [b])
partitionEithers ([Either (ParseError String Void) (String, String)]
 -> ([ParseError String Void], [(String, String)]))
-> (String -> [Either (ParseError String Void) (String, String)])
-> String
-> ([ParseError String Void], [(String, String)])
forall b c a. (b -> c) -> (a -> b) -> a -> c
. String -> [Either (ParseError String Void) (String, String)]
getAllAssignments (String -> ([ParseError String Void], [(String, String)]))
-> String -> ([ParseError String Void], [(String, String)])
forall a b. (a -> b) -> a -> b
$ String
s
      osr :: OsRelease
osr         = [(String, String)] -> OsRelease
getOsRelease [(String, String)]
ass
      unknown_fields' :: [(String, String)]
unknown_fields' =
          HashMap String String -> [(String, String)]
forall k v. HashMap k v -> [(k, v)]
HM.toList
            (HashMap String String -> [(String, String)])
-> ([String] -> HashMap String String)
-> [String]
-> [(String, String)]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. (String -> HashMap String String -> HashMap String String)
-> HashMap String String -> [String] -> HashMap String String
forall (t :: * -> *) a b.
Foldable t =>
(a -> b -> b) -> b -> t a -> b
foldr (\String
x HashMap String String
y -> String -> HashMap String String -> HashMap String String
forall k v. (Eq k, Hashable k) => k -> HashMap k v -> HashMap k v
HM.delete ((Char -> Char) -> ShowS
forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b
fmap Char -> Char
toUpper String
x) HashMap String String
y) ([(String, String)] -> HashMap String String
forall k v. (Eq k, Hashable k) => [(k, v)] -> HashMap k v
HM.fromList [(String, String)]
ass)
            ([String] -> [(String, String)]) -> [String] -> [(String, String)]
forall a b. (a -> b) -> a -> b
$ ([String] -> [String]
forall a. [a] -> [a]
init ([String] -> [String])
-> (OsRelease -> [String]) -> OsRelease -> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. M1
  D
  ('MetaData
     "OsRelease"
     "System.OsRelease"
     "os-release-1.0.2-99VG88fVJ42FQqeWEwKbmV"
     'False)
  (C1
     ('MetaCons "OsRelease" 'PrefixI 'True)
     ((((S1
           ('MetaSel
              ('Just "name") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
           (Rec0 String)
         :*: S1
               ('MetaSel
                  ('Just "version")
                  'NoSourceUnpackedness
                  'SourceStrict
                  'DecidedStrict)
               (Rec0 (Maybe String)))
        :*: (S1
               ('MetaSel
                  ('Just "id") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
               (Rec0 String)
             :*: S1
                   ('MetaSel
                      ('Just "id_like")
                      'NoSourceUnpackedness
                      'SourceStrict
                      'DecidedStrict)
                   (Rec0 (Maybe String))))
       :*: ((S1
               ('MetaSel
                  ('Just "version_codename")
                  'NoSourceUnpackedness
                  'SourceStrict
                  'DecidedStrict)
               (Rec0 (Maybe String))
             :*: S1
                   ('MetaSel
                      ('Just "version_id")
                      'NoSourceUnpackedness
                      'SourceStrict
                      'DecidedStrict)
                   (Rec0 (Maybe String)))
            :*: (S1
                   ('MetaSel
                      ('Just "pretty_name")
                      'NoSourceUnpackedness
                      'SourceStrict
                      'DecidedStrict)
                   (Rec0 String)
                 :*: (S1
                        ('MetaSel
                           ('Just "ansi_color")
                           'NoSourceUnpackedness
                           'SourceStrict
                           'DecidedStrict)
                        (Rec0 (Maybe String))
                      :*: S1
                            ('MetaSel
                               ('Just "cpe_name")
                               'NoSourceUnpackedness
                               'SourceStrict
                               'DecidedStrict)
                            (Rec0 (Maybe String))))))
      :*: (((S1
               ('MetaSel
                  ('Just "home_url")
                  'NoSourceUnpackedness
                  'SourceStrict
                  'DecidedStrict)
               (Rec0 (Maybe String))
             :*: S1
                   ('MetaSel
                      ('Just "documentation_url")
                      'NoSourceUnpackedness
                      'SourceStrict
                      'DecidedStrict)
                   (Rec0 (Maybe String)))
            :*: (S1
                   ('MetaSel
                      ('Just "support_url")
                      'NoSourceUnpackedness
                      'SourceStrict
                      'DecidedStrict)
                   (Rec0 (Maybe String))
                 :*: S1
                       ('MetaSel
                          ('Just "bug_report_url")
                          'NoSourceUnpackedness
                          'SourceStrict
                          'DecidedStrict)
                       (Rec0 (Maybe String))))
           :*: ((S1
                   ('MetaSel
                      ('Just "privacy_policy_url")
                      'NoSourceUnpackedness
                      'SourceStrict
                      'DecidedStrict)
                   (Rec0 (Maybe String))
                 :*: S1
                       ('MetaSel
                          ('Just "build_id")
                          'NoSourceUnpackedness
                          'SourceStrict
                          'DecidedStrict)
                       (Rec0 (Maybe String)))
                :*: (S1
                       ('MetaSel
                          ('Just "variant")
                          'NoSourceUnpackedness
                          'SourceStrict
                          'DecidedStrict)
                       (Rec0 (Maybe String))
                     :*: (S1
                            ('MetaSel
                               ('Just "variant_id")
                               'NoSourceUnpackedness
                               'SourceStrict
                               'DecidedStrict)
                            (Rec0 (Maybe String))
                          :*: S1
                                ('MetaSel
                                   ('Just "logo")
                                   'NoSourceUnpackedness
                                   'SourceStrict
                                   'DecidedStrict)
                                (Rec0 (Maybe String))))))))
  Any
-> [String]
forall a. GetRecords a => a -> [String]
getRecords (M1
   D
   ('MetaData
      "OsRelease"
      "System.OsRelease"
      "os-release-1.0.2-99VG88fVJ42FQqeWEwKbmV"
      'False)
   (C1
      ('MetaCons "OsRelease" 'PrefixI 'True)
      ((((S1
            ('MetaSel
               ('Just "name") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
            (Rec0 String)
          :*: S1
                ('MetaSel
                   ('Just "version")
                   'NoSourceUnpackedness
                   'SourceStrict
                   'DecidedStrict)
                (Rec0 (Maybe String)))
         :*: (S1
                ('MetaSel
                   ('Just "id") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
                (Rec0 String)
              :*: S1
                    ('MetaSel
                       ('Just "id_like")
                       'NoSourceUnpackedness
                       'SourceStrict
                       'DecidedStrict)
                    (Rec0 (Maybe String))))
        :*: ((S1
                ('MetaSel
                   ('Just "version_codename")
                   'NoSourceUnpackedness
                   'SourceStrict
                   'DecidedStrict)
                (Rec0 (Maybe String))
              :*: S1
                    ('MetaSel
                       ('Just "version_id")
                       'NoSourceUnpackedness
                       'SourceStrict
                       'DecidedStrict)
                    (Rec0 (Maybe String)))
             :*: (S1
                    ('MetaSel
                       ('Just "pretty_name")
                       'NoSourceUnpackedness
                       'SourceStrict
                       'DecidedStrict)
                    (Rec0 String)
                  :*: (S1
                         ('MetaSel
                            ('Just "ansi_color")
                            'NoSourceUnpackedness
                            'SourceStrict
                            'DecidedStrict)
                         (Rec0 (Maybe String))
                       :*: S1
                             ('MetaSel
                                ('Just "cpe_name")
                                'NoSourceUnpackedness
                                'SourceStrict
                                'DecidedStrict)
                             (Rec0 (Maybe String))))))
       :*: (((S1
                ('MetaSel
                   ('Just "home_url")
                   'NoSourceUnpackedness
                   'SourceStrict
                   'DecidedStrict)
                (Rec0 (Maybe String))
              :*: S1
                    ('MetaSel
                       ('Just "documentation_url")
                       'NoSourceUnpackedness
                       'SourceStrict
                       'DecidedStrict)
                    (Rec0 (Maybe String)))
             :*: (S1
                    ('MetaSel
                       ('Just "support_url")
                       'NoSourceUnpackedness
                       'SourceStrict
                       'DecidedStrict)
                    (Rec0 (Maybe String))
                  :*: S1
                        ('MetaSel
                           ('Just "bug_report_url")
                           'NoSourceUnpackedness
                           'SourceStrict
                           'DecidedStrict)
                        (Rec0 (Maybe String))))
            :*: ((S1
                    ('MetaSel
                       ('Just "privacy_policy_url")
                       'NoSourceUnpackedness
                       'SourceStrict
                       'DecidedStrict)
                    (Rec0 (Maybe String))
                  :*: S1
                        ('MetaSel
                           ('Just "build_id")
                           'NoSourceUnpackedness
                           'SourceStrict
                           'DecidedStrict)
                        (Rec0 (Maybe String)))
                 :*: (S1
                        ('MetaSel
                           ('Just "variant")
                           'NoSourceUnpackedness
                           'SourceStrict
                           'DecidedStrict)
                        (Rec0 (Maybe String))
                      :*: (S1
                             ('MetaSel
                                ('Just "variant_id")
                                'NoSourceUnpackedness
                                'SourceStrict
                                'DecidedStrict)
                             (Rec0 (Maybe String))
                           :*: S1
                                 ('MetaSel
                                    ('Just "logo")
                                    'NoSourceUnpackedness
                                    'SourceStrict
                                    'DecidedStrict)
                                 (Rec0 (Maybe String))))))))
   Any
 -> [String])
-> (OsRelease
    -> M1
         D
         ('MetaData
            "OsRelease"
            "System.OsRelease"
            "os-release-1.0.2-99VG88fVJ42FQqeWEwKbmV"
            'False)
         (C1
            ('MetaCons "OsRelease" 'PrefixI 'True)
            ((((S1
                  ('MetaSel
                     ('Just "name") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
                  (Rec0 String)
                :*: S1
                      ('MetaSel
                         ('Just "version")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String)))
               :*: (S1
                      ('MetaSel
                         ('Just "id") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
                      (Rec0 String)
                    :*: S1
                          ('MetaSel
                             ('Just "id_like")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String))))
              :*: ((S1
                      ('MetaSel
                         ('Just "version_codename")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String))
                    :*: S1
                          ('MetaSel
                             ('Just "version_id")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String)))
                   :*: (S1
                          ('MetaSel
                             ('Just "pretty_name")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 String)
                        :*: (S1
                               ('MetaSel
                                  ('Just "ansi_color")
                                  'NoSourceUnpackedness
                                  'SourceStrict
                                  'DecidedStrict)
                               (Rec0 (Maybe String))
                             :*: S1
                                   ('MetaSel
                                      ('Just "cpe_name")
                                      'NoSourceUnpackedness
                                      'SourceStrict
                                      'DecidedStrict)
                                   (Rec0 (Maybe String))))))
             :*: (((S1
                      ('MetaSel
                         ('Just "home_url")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String))
                    :*: S1
                          ('MetaSel
                             ('Just "documentation_url")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String)))
                   :*: (S1
                          ('MetaSel
                             ('Just "support_url")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String))
                        :*: S1
                              ('MetaSel
                                 ('Just "bug_report_url")
                                 'NoSourceUnpackedness
                                 'SourceStrict
                                 'DecidedStrict)
                              (Rec0 (Maybe String))))
                  :*: ((S1
                          ('MetaSel
                             ('Just "privacy_policy_url")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String))
                        :*: S1
                              ('MetaSel
                                 ('Just "build_id")
                                 'NoSourceUnpackedness
                                 'SourceStrict
                                 'DecidedStrict)
                              (Rec0 (Maybe String)))
                       :*: (S1
                              ('MetaSel
                                 ('Just "variant")
                                 'NoSourceUnpackedness
                                 'SourceStrict
                                 'DecidedStrict)
                              (Rec0 (Maybe String))
                            :*: (S1
                                   ('MetaSel
                                      ('Just "variant_id")
                                      'NoSourceUnpackedness
                                      'SourceStrict
                                      'DecidedStrict)
                                   (Rec0 (Maybe String))
                                 :*: S1
                                       ('MetaSel
                                          ('Just "logo")
                                          'NoSourceUnpackedness
                                          'SourceStrict
                                          'DecidedStrict)
                                       (Rec0 (Maybe String))))))))
         Any)
-> OsRelease
-> [String]
forall b c a. (b -> c) -> (a -> b) -> a -> c
. OsRelease
-> M1
     D
     ('MetaData
        "OsRelease"
        "System.OsRelease"
        "os-release-1.0.2-99VG88fVJ42FQqeWEwKbmV"
        'False)
     (C1
        ('MetaCons "OsRelease" 'PrefixI 'True)
        ((((S1
              ('MetaSel
                 ('Just "name") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
              (Rec0 String)
            :*: S1
                  ('MetaSel
                     ('Just "version")
                     'NoSourceUnpackedness
                     'SourceStrict
                     'DecidedStrict)
                  (Rec0 (Maybe String)))
           :*: (S1
                  ('MetaSel
                     ('Just "id") 'NoSourceUnpackedness 'SourceStrict 'DecidedStrict)
                  (Rec0 String)
                :*: S1
                      ('MetaSel
                         ('Just "id_like")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String))))
          :*: ((S1
                  ('MetaSel
                     ('Just "version_codename")
                     'NoSourceUnpackedness
                     'SourceStrict
                     'DecidedStrict)
                  (Rec0 (Maybe String))
                :*: S1
                      ('MetaSel
                         ('Just "version_id")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String)))
               :*: (S1
                      ('MetaSel
                         ('Just "pretty_name")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 String)
                    :*: (S1
                           ('MetaSel
                              ('Just "ansi_color")
                              'NoSourceUnpackedness
                              'SourceStrict
                              'DecidedStrict)
                           (Rec0 (Maybe String))
                         :*: S1
                               ('MetaSel
                                  ('Just "cpe_name")
                                  'NoSourceUnpackedness
                                  'SourceStrict
                                  'DecidedStrict)
                               (Rec0 (Maybe String))))))
         :*: (((S1
                  ('MetaSel
                     ('Just "home_url")
                     'NoSourceUnpackedness
                     'SourceStrict
                     'DecidedStrict)
                  (Rec0 (Maybe String))
                :*: S1
                      ('MetaSel
                         ('Just "documentation_url")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String)))
               :*: (S1
                      ('MetaSel
                         ('Just "support_url")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String))
                    :*: S1
                          ('MetaSel
                             ('Just "bug_report_url")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String))))
              :*: ((S1
                      ('MetaSel
                         ('Just "privacy_policy_url")
                         'NoSourceUnpackedness
                         'SourceStrict
                         'DecidedStrict)
                      (Rec0 (Maybe String))
                    :*: S1
                          ('MetaSel
                             ('Just "build_id")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String)))
                   :*: (S1
                          ('MetaSel
                             ('Just "variant")
                             'NoSourceUnpackedness
                             'SourceStrict
                             'DecidedStrict)
                          (Rec0 (Maybe String))
                        :*: (S1
                               ('MetaSel
                                  ('Just "variant_id")
                                  'NoSourceUnpackedness
                                  'SourceStrict
                                  'DecidedStrict)
                               (Rec0 (Maybe String))
                             :*: S1
                                   ('MetaSel
                                      ('Just "logo")
                                      'NoSourceUnpackedness
                                      'SourceStrict
                                      'DecidedStrict)
                                   (Rec0 (Maybe String))))))))
     Any
forall a x. Generic a => a -> Rep a x
from (OsRelease -> [String]) -> OsRelease -> [String]
forall a b. (a -> b) -> a -> b
$ OsRelease
defaultOsRelease)
  in  OsRelease
-> [(String, String)]
-> [ParseError String Void]
-> OsReleaseResult
OsReleaseResult OsRelease
osr [(String, String)]
unknown_fields' [ParseError String Void]
errs