packages feed

gogol-books-1.0.0: gen/Gogol/Books/Internal/Product.hs

{-# LANGUAGE DataKinds #-}
{-# LANGUAGE DerivingStrategies #-}
{-# LANGUAGE DuplicateRecordFields #-}
{-# LANGUAGE ImportQualifiedPost #-}
{-# LANGUAGE LambdaCase #-}
{-# LANGUAGE OverloadedStrings #-}
{-# LANGUAGE PatternSynonyms #-}
{-# LANGUAGE RecordWildCards #-}
{-# LANGUAGE StrictData #-}
{-# LANGUAGE TypeFamilies #-}
{-# LANGUAGE NoImplicitPrelude #-}
{-# OPTIONS_GHC -fno-warn-duplicate-exports #-}
{-# OPTIONS_GHC -fno-warn-name-shadowing #-}
{-# OPTIONS_GHC -fno-warn-unused-binds #-}
{-# OPTIONS_GHC -fno-warn-unused-imports #-}
{-# OPTIONS_GHC -fno-warn-unused-matches #-}

-- |
-- Module      : Gogol.Books.Internal.Product
-- Copyright   : (c) 2015-2025 Brendan Hay
-- License     : Mozilla Public License, v. 2.0.
-- Maintainer  : Brendan Hay <brendan.g.hay+gogol@gmail.com>
--               Toni Cebrián <toni@tonicebrian.com>
-- Stability   : auto-generated
-- Portability : non-portable (GHC extensions)
module Gogol.Books.Internal.Product
  ( -- * Annotation
    Annotation (..),
    newAnnotation,

    -- * Annotation_ClientVersionRanges
    Annotation_ClientVersionRanges (..),
    newAnnotation_ClientVersionRanges,

    -- * Annotation_CurrentVersionRanges
    Annotation_CurrentVersionRanges (..),
    newAnnotation_CurrentVersionRanges,

    -- * Annotation_LayerSummary
    Annotation_LayerSummary (..),
    newAnnotation_LayerSummary,

    -- * Annotations
    Annotations (..),
    newAnnotations,

    -- * AnnotationsSummary
    AnnotationsSummary (..),
    newAnnotationsSummary,

    -- * AnnotationsSummary_LayersItem
    AnnotationsSummary_LayersItem (..),
    newAnnotationsSummary_LayersItem,

    -- * Annotationsdata
    Annotationsdata (..),
    newAnnotationsdata,

    -- * BooksAnnotationsRange
    BooksAnnotationsRange (..),
    newBooksAnnotationsRange,

    -- * BooksCloudloadingResource
    BooksCloudloadingResource (..),
    newBooksCloudloadingResource,

    -- * BooksVolumesRecommendedRateResponse
    BooksVolumesRecommendedRateResponse (..),
    newBooksVolumesRecommendedRateResponse,

    -- * Bookshelf
    Bookshelf (..),
    newBookshelf,

    -- * Bookshelves
    Bookshelves (..),
    newBookshelves,

    -- * Category
    Category (..),
    newCategory,

    -- * Category_ItemsItem
    Category_ItemsItem (..),
    newCategory_ItemsItem,

    -- * ConcurrentAccessRestriction
    ConcurrentAccessRestriction (..),
    newConcurrentAccessRestriction,

    -- * DictionaryAnnotationdata
    DictionaryAnnotationdata (..),
    newDictionaryAnnotationdata,

    -- * Dictlayerdata
    Dictlayerdata (..),
    newDictlayerdata,

    -- * Dictlayerdata_Common
    Dictlayerdata_Common (..),
    newDictlayerdata_Common,

    -- * Dictlayerdata_Dict
    Dictlayerdata_Dict (..),
    newDictlayerdata_Dict,

    -- * Dictlayerdata_Dict_Source
    Dictlayerdata_Dict_Source (..),
    newDictlayerdata_Dict_Source,

    -- * Dictlayerdata_Dict_WordsItem
    Dictlayerdata_Dict_WordsItem (..),
    newDictlayerdata_Dict_WordsItem,

    -- * Dictlayerdata_Dict_WordsItem_DerivativesItem
    Dictlayerdata_Dict_WordsItem_DerivativesItem (..),
    newDictlayerdata_Dict_WordsItem_DerivativesItem,

    -- * Dictlayerdata_Dict_WordsItem_DerivativesItem_Source
    Dictlayerdata_Dict_WordsItem_DerivativesItem_Source (..),
    newDictlayerdata_Dict_WordsItem_DerivativesItem_Source,

    -- * Dictlayerdata_Dict_WordsItem_ExamplesItem
    Dictlayerdata_Dict_WordsItem_ExamplesItem (..),
    newDictlayerdata_Dict_WordsItem_ExamplesItem,

    -- * Dictlayerdata_Dict_WordsItem_ExamplesItem_Source
    Dictlayerdata_Dict_WordsItem_ExamplesItem_Source (..),
    newDictlayerdata_Dict_WordsItem_ExamplesItem_Source,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem
    Dictlayerdata_Dict_WordsItem_SensesItem (..),
    newDictlayerdata_Dict_WordsItem_SensesItem,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem
    Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem (..),
    newDictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem (..),
    newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem (..),
    newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source (..),
    newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem_Source
    Dictlayerdata_Dict_WordsItem_SensesItem_Source (..),
    newDictlayerdata_Dict_WordsItem_SensesItem_Source,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem
    Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem (..),
    newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem,

    -- * Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
    Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source (..),
    newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source,

    -- * Dictlayerdata_Dict_WordsItem_Source
    Dictlayerdata_Dict_WordsItem_Source (..),
    newDictlayerdata_Dict_WordsItem_Source,

    -- * Discoveryclusters
    Discoveryclusters (..),
    newDiscoveryclusters,

    -- * Discoveryclusters_ClustersItem
    Discoveryclusters_ClustersItem (..),
    newDiscoveryclusters_ClustersItem,

    -- * Discoveryclusters_ClustersItem_Banner_with_content_container
    Discoveryclusters_ClustersItem_Banner_with_content_container (..),
    newDiscoveryclusters_ClustersItem_Banner_with_content_container,

    -- * DownloadAccessRestriction
    DownloadAccessRestriction (..),
    newDownloadAccessRestriction,

    -- * DownloadAccesses
    DownloadAccesses (..),
    newDownloadAccesses,

    -- * Empty
    Empty (..),
    newEmpty,

    -- * FamilyInfo
    FamilyInfo (..),
    newFamilyInfo,

    -- * FamilyInfo_Membership
    FamilyInfo_Membership (..),
    newFamilyInfo_Membership,

    -- * GeoAnnotationdata
    GeoAnnotationdata (..),
    newGeoAnnotationdata,

    -- * Geolayerdata
    Geolayerdata (..),
    newGeolayerdata,

    -- * Geolayerdata_Common
    Geolayerdata_Common (..),
    newGeolayerdata_Common,

    -- * Geolayerdata_Geo
    Geolayerdata_Geo (..),
    newGeolayerdata_Geo,

    -- * Geolayerdata_Geo_Viewport
    Geolayerdata_Geo_Viewport (..),
    newGeolayerdata_Geo_Viewport,

    -- * Geolayerdata_Geo_Viewport_Hi
    Geolayerdata_Geo_Viewport_Hi (..),
    newGeolayerdata_Geo_Viewport_Hi,

    -- * Geolayerdata_Geo_Viewport_Lo
    Geolayerdata_Geo_Viewport_Lo (..),
    newGeolayerdata_Geo_Viewport_Lo,

    -- * Layersummaries
    Layersummaries (..),
    newLayersummaries,

    -- * Layersummary
    Layersummary (..),
    newLayersummary,

    -- * Metadata
    Metadata (..),
    newMetadata,

    -- * Metadata_ItemsItem
    Metadata_ItemsItem (..),
    newMetadata_ItemsItem,

    -- * Notification
    Notification (..),
    newNotification,

    -- * Offers
    Offers (..),
    newOffers,

    -- * Offers_ItemsItem
    Offers_ItemsItem (..),
    newOffers_ItemsItem,

    -- * Offers_ItemsItem_ItemsItem
    Offers_ItemsItem_ItemsItem (..),
    newOffers_ItemsItem_ItemsItem,

    -- * ReadingPosition
    ReadingPosition (..),
    newReadingPosition,

    -- * RequestAccessData
    RequestAccessData (..),
    newRequestAccessData,

    -- * Review
    Review (..),
    newReview,

    -- * Review_Author
    Review_Author (..),
    newReview_Author,

    -- * Review_Source
    Review_Source (..),
    newReview_Source,

    -- * Series
    Series (..),
    newSeries,

    -- * Series_SeriesItem
    Series_SeriesItem (..),
    newSeries_SeriesItem,

    -- * Series_SeriesItem_SeriesSubscriptionReleaseInfo
    Series_SeriesItem_SeriesSubscriptionReleaseInfo (..),
    newSeries_SeriesItem_SeriesSubscriptionReleaseInfo,

    -- * Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo (..),
    newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo,

    -- * Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo (..),
    newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo,

    -- * Seriesmembership
    Seriesmembership (..),
    newSeriesmembership,

    -- * Usersettings
    Usersettings (..),
    newUsersettings,

    -- * Usersettings_NotesExport
    Usersettings_NotesExport (..),
    newUsersettings_NotesExport,

    -- * Usersettings_Notification
    Usersettings_Notification (..),
    newUsersettings_Notification,

    -- * Usersettings_Notification_MatchMyInterests
    Usersettings_Notification_MatchMyInterests (..),
    newUsersettings_Notification_MatchMyInterests,

    -- * Usersettings_Notification_MoreFromAuthors
    Usersettings_Notification_MoreFromAuthors (..),
    newUsersettings_Notification_MoreFromAuthors,

    -- * Usersettings_Notification_MoreFromSeries
    Usersettings_Notification_MoreFromSeries (..),
    newUsersettings_Notification_MoreFromSeries,

    -- * Usersettings_Notification_PriceDrop
    Usersettings_Notification_PriceDrop (..),
    newUsersettings_Notification_PriceDrop,

    -- * Usersettings_Notification_RewardExpirations
    Usersettings_Notification_RewardExpirations (..),
    newUsersettings_Notification_RewardExpirations,

    -- * Volume
    Volume (..),
    newVolume,

    -- * Volume_AccessInfo
    Volume_AccessInfo (..),
    newVolume_AccessInfo,

    -- * Volume_AccessInfo_Epub
    Volume_AccessInfo_Epub (..),
    newVolume_AccessInfo_Epub,

    -- * Volume_AccessInfo_Pdf
    Volume_AccessInfo_Pdf (..),
    newVolume_AccessInfo_Pdf,

    -- * Volume_LayerInfo
    Volume_LayerInfo (..),
    newVolume_LayerInfo,

    -- * Volume_LayerInfo_LayersItem
    Volume_LayerInfo_LayersItem (..),
    newVolume_LayerInfo_LayersItem,

    -- * Volume_RecommendedInfo
    Volume_RecommendedInfo (..),
    newVolume_RecommendedInfo,

    -- * Volume_SaleInfo
    Volume_SaleInfo (..),
    newVolume_SaleInfo,

    -- * Volume_SaleInfo_ListPrice
    Volume_SaleInfo_ListPrice (..),
    newVolume_SaleInfo_ListPrice,

    -- * Volume_SaleInfo_OffersItem
    Volume_SaleInfo_OffersItem (..),
    newVolume_SaleInfo_OffersItem,

    -- * Volume_SaleInfo_OffersItem_ListPrice
    Volume_SaleInfo_OffersItem_ListPrice (..),
    newVolume_SaleInfo_OffersItem_ListPrice,

    -- * Volume_SaleInfo_OffersItem_RentalDuration
    Volume_SaleInfo_OffersItem_RentalDuration (..),
    newVolume_SaleInfo_OffersItem_RentalDuration,

    -- * Volume_SaleInfo_OffersItem_RetailPrice
    Volume_SaleInfo_OffersItem_RetailPrice (..),
    newVolume_SaleInfo_OffersItem_RetailPrice,

    -- * Volume_SaleInfo_RetailPrice
    Volume_SaleInfo_RetailPrice (..),
    newVolume_SaleInfo_RetailPrice,

    -- * Volume_SearchInfo
    Volume_SearchInfo (..),
    newVolume_SearchInfo,

    -- * Volume_UserInfo
    Volume_UserInfo (..),
    newVolume_UserInfo,

    -- * Volume_UserInfo_Copy
    Volume_UserInfo_Copy (..),
    newVolume_UserInfo_Copy,

    -- * Volume_UserInfo_FamilySharing
    Volume_UserInfo_FamilySharing (..),
    newVolume_UserInfo_FamilySharing,

    -- * Volume_UserInfo_RentalPeriod
    Volume_UserInfo_RentalPeriod (..),
    newVolume_UserInfo_RentalPeriod,

    -- * Volume_UserInfo_UserUploadedVolumeInfo
    Volume_UserInfo_UserUploadedVolumeInfo (..),
    newVolume_UserInfo_UserUploadedVolumeInfo,

    -- * Volume_VolumeInfo
    Volume_VolumeInfo (..),
    newVolume_VolumeInfo,

    -- * Volume_VolumeInfo_Dimensions
    Volume_VolumeInfo_Dimensions (..),
    newVolume_VolumeInfo_Dimensions,

    -- * Volume_VolumeInfo_ImageLinks
    Volume_VolumeInfo_ImageLinks (..),
    newVolume_VolumeInfo_ImageLinks,

    -- * Volume_VolumeInfo_IndustryIdentifiersItem
    Volume_VolumeInfo_IndustryIdentifiersItem (..),
    newVolume_VolumeInfo_IndustryIdentifiersItem,

    -- * Volume_VolumeInfo_PanelizationSummary
    Volume_VolumeInfo_PanelizationSummary (..),
    newVolume_VolumeInfo_PanelizationSummary,

    -- * Volume_VolumeInfo_ReadingModes
    Volume_VolumeInfo_ReadingModes (..),
    newVolume_VolumeInfo_ReadingModes,

    -- * Volume2
    Volume2 (..),
    newVolume2,

    -- * Volumeannotation
    Volumeannotation (..),
    newVolumeannotation,

    -- * Volumeannotation_ContentRanges
    Volumeannotation_ContentRanges (..),
    newVolumeannotation_ContentRanges,

    -- * Volumeannotations
    Volumeannotations (..),
    newVolumeannotations,

    -- * Volumes
    Volumes (..),
    newVolumes,

    -- * Volumeseriesinfo
    Volumeseriesinfo (..),
    newVolumeseriesinfo,

    -- * Volumeseriesinfo_VolumeSeriesItem
    Volumeseriesinfo_VolumeSeriesItem (..),
    newVolumeseriesinfo_VolumeSeriesItem,

    -- * Volumeseriesinfo_VolumeSeriesItem_IssueItem
    Volumeseriesinfo_VolumeSeriesItem_IssueItem (..),
    newVolumeseriesinfo_VolumeSeriesItem_IssueItem,
  )
where

import Gogol.Books.Internal.Sum
import Gogol.Prelude qualified as Core

--
-- /See:/ 'newAnnotation' smart constructor.
data Annotation = Annotation
  { -- | Anchor text after excerpt. For requests, if the user bookmarked a screen that has no flowing text on it, then this field should be empty.
    afterSelectedText :: (Core.Maybe Core.Text),
    -- | Anchor text before excerpt. For requests, if the user bookmarked a screen that has no flowing text on it, then this field should be empty.
    beforeSelectedText :: (Core.Maybe Core.Text),
    -- | Selection ranges sent from the client.
    clientVersionRanges :: (Core.Maybe Annotation_ClientVersionRanges),
    -- | Timestamp for the created time of this annotation.
    created :: (Core.Maybe Core.Text),
    -- | Selection ranges for the most recent content version.
    currentVersionRanges :: (Core.Maybe Annotation_CurrentVersionRanges),
    -- | User-created data for this annotation.
    data' :: (Core.Maybe Core.Text),
    -- | Indicates that this annotation is deleted.
    deleted :: (Core.Maybe Core.Bool),
    -- | The highlight style for this annotation.
    highlightStyle :: (Core.Maybe Core.Text),
    -- | Id of this annotation, in the form of a GUID.
    id :: (Core.Maybe Core.Text),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | The layer this annotation is for.
    layerId :: (Core.Maybe Core.Text),
    layerSummary :: (Core.Maybe Annotation_LayerSummary),
    -- | Pages that this annotation spans.
    pageIds :: (Core.Maybe [Core.Text]),
    -- | Excerpt from the volume.
    selectedText :: (Core.Maybe Core.Text),
    -- | URL to this resource.
    selfLink :: (Core.Maybe Core.Text),
    -- | Timestamp for the last time this annotation was modified.
    updated :: (Core.Maybe Core.Text),
    -- | The volume that this annotation belongs to.
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Annotation' with the minimum fields required to make a request.
newAnnotation ::
  Annotation
newAnnotation =
  Annotation
    { afterSelectedText = Core.Nothing,
      beforeSelectedText = Core.Nothing,
      clientVersionRanges = Core.Nothing,
      created = Core.Nothing,
      currentVersionRanges = Core.Nothing,
      data' = Core.Nothing,
      deleted = Core.Nothing,
      highlightStyle = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      layerId = Core.Nothing,
      layerSummary = Core.Nothing,
      pageIds = Core.Nothing,
      selectedText = Core.Nothing,
      selfLink = Core.Nothing,
      updated = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON Annotation where
  parseJSON =
    Core.withObject
      "Annotation"
      ( \o ->
          Annotation
            Core.<$> (o Core..:? "afterSelectedText")
            Core.<*> (o Core..:? "beforeSelectedText")
            Core.<*> (o Core..:? "clientVersionRanges")
            Core.<*> (o Core..:? "created")
            Core.<*> (o Core..:? "currentVersionRanges")
            Core.<*> (o Core..:? "data")
            Core.<*> (o Core..:? "deleted")
            Core.<*> (o Core..:? "highlightStyle")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "layerId")
            Core.<*> (o Core..:? "layerSummary")
            Core.<*> (o Core..:? "pageIds")
            Core.<*> (o Core..:? "selectedText")
            Core.<*> (o Core..:? "selfLink")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON Annotation where
  toJSON Annotation {..} =
    Core.object
      ( Core.catMaybes
          [ ("afterSelectedText" Core..=) Core.<$> afterSelectedText,
            ("beforeSelectedText" Core..=) Core.<$> beforeSelectedText,
            ("clientVersionRanges" Core..=) Core.<$> clientVersionRanges,
            ("created" Core..=) Core.<$> created,
            ("currentVersionRanges" Core..=) Core.<$> currentVersionRanges,
            ("data" Core..=) Core.<$> data',
            ("deleted" Core..=) Core.<$> deleted,
            ("highlightStyle" Core..=) Core.<$> highlightStyle,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("layerId" Core..=) Core.<$> layerId,
            ("layerSummary" Core..=) Core.<$> layerSummary,
            ("pageIds" Core..=) Core.<$> pageIds,
            ("selectedText" Core..=) Core.<$> selectedText,
            ("selfLink" Core..=) Core.<$> selfLink,
            ("updated" Core..=) Core.<$> updated,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

-- | Selection ranges sent from the client.
--
-- /See:/ 'newAnnotation_ClientVersionRanges' smart constructor.
data Annotation_ClientVersionRanges = Annotation_ClientVersionRanges
  { -- | Range in CFI format for this annotation sent by client.
    cfiRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Content version the client sent in.
    contentVersion :: (Core.Maybe Core.Text),
    -- | Range in GB image format for this annotation sent by client.
    gbImageRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Range in GB text format for this annotation sent by client.
    gbTextRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Range in image CFI format for this annotation sent by client.
    imageCfiRange :: (Core.Maybe BooksAnnotationsRange)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Annotation_ClientVersionRanges' with the minimum fields required to make a request.
newAnnotation_ClientVersionRanges ::
  Annotation_ClientVersionRanges
newAnnotation_ClientVersionRanges =
  Annotation_ClientVersionRanges
    { cfiRange = Core.Nothing,
      contentVersion = Core.Nothing,
      gbImageRange = Core.Nothing,
      gbTextRange = Core.Nothing,
      imageCfiRange = Core.Nothing
    }

instance Core.FromJSON Annotation_ClientVersionRanges where
  parseJSON =
    Core.withObject
      "Annotation_ClientVersionRanges"
      ( \o ->
          Annotation_ClientVersionRanges
            Core.<$> (o Core..:? "cfiRange")
            Core.<*> (o Core..:? "contentVersion")
            Core.<*> (o Core..:? "gbImageRange")
            Core.<*> (o Core..:? "gbTextRange")
            Core.<*> (o Core..:? "imageCfiRange")
      )

instance Core.ToJSON Annotation_ClientVersionRanges where
  toJSON Annotation_ClientVersionRanges {..} =
    Core.object
      ( Core.catMaybes
          [ ("cfiRange" Core..=) Core.<$> cfiRange,
            ("contentVersion" Core..=) Core.<$> contentVersion,
            ("gbImageRange" Core..=) Core.<$> gbImageRange,
            ("gbTextRange" Core..=) Core.<$> gbTextRange,
            ("imageCfiRange" Core..=) Core.<$> imageCfiRange
          ]
      )

-- | Selection ranges for the most recent content version.
--
-- /See:/ 'newAnnotation_CurrentVersionRanges' smart constructor.
data Annotation_CurrentVersionRanges = Annotation_CurrentVersionRanges
  { -- | Range in CFI format for this annotation for version above.
    cfiRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Content version applicable to ranges below.
    contentVersion :: (Core.Maybe Core.Text),
    -- | Range in GB image format for this annotation for version above.
    gbImageRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Range in GB text format for this annotation for version above.
    gbTextRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Range in image CFI format for this annotation for version above.
    imageCfiRange :: (Core.Maybe BooksAnnotationsRange)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Annotation_CurrentVersionRanges' with the minimum fields required to make a request.
newAnnotation_CurrentVersionRanges ::
  Annotation_CurrentVersionRanges
newAnnotation_CurrentVersionRanges =
  Annotation_CurrentVersionRanges
    { cfiRange = Core.Nothing,
      contentVersion = Core.Nothing,
      gbImageRange = Core.Nothing,
      gbTextRange = Core.Nothing,
      imageCfiRange = Core.Nothing
    }

instance Core.FromJSON Annotation_CurrentVersionRanges where
  parseJSON =
    Core.withObject
      "Annotation_CurrentVersionRanges"
      ( \o ->
          Annotation_CurrentVersionRanges
            Core.<$> (o Core..:? "cfiRange")
            Core.<*> (o Core..:? "contentVersion")
            Core.<*> (o Core..:? "gbImageRange")
            Core.<*> (o Core..:? "gbTextRange")
            Core.<*> (o Core..:? "imageCfiRange")
      )

instance Core.ToJSON Annotation_CurrentVersionRanges where
  toJSON Annotation_CurrentVersionRanges {..} =
    Core.object
      ( Core.catMaybes
          [ ("cfiRange" Core..=) Core.<$> cfiRange,
            ("contentVersion" Core..=) Core.<$> contentVersion,
            ("gbImageRange" Core..=) Core.<$> gbImageRange,
            ("gbTextRange" Core..=) Core.<$> gbTextRange,
            ("imageCfiRange" Core..=) Core.<$> imageCfiRange
          ]
      )

--
-- /See:/ 'newAnnotation_LayerSummary' smart constructor.
data Annotation_LayerSummary = Annotation_LayerSummary
  { -- | Maximum allowed characters on this layer, especially for the \"copy\" layer.
    allowedCharacterCount :: (Core.Maybe Core.Int32),
    -- | Type of limitation on this layer. \"limited\" or \"unlimited\" for the \"copy\" layer.
    limitType :: (Core.Maybe Core.Text),
    -- | Remaining allowed characters on this layer, especially for the \"copy\" layer.
    remainingCharacterCount :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Annotation_LayerSummary' with the minimum fields required to make a request.
newAnnotation_LayerSummary ::
  Annotation_LayerSummary
newAnnotation_LayerSummary =
  Annotation_LayerSummary
    { allowedCharacterCount = Core.Nothing,
      limitType = Core.Nothing,
      remainingCharacterCount = Core.Nothing
    }

instance Core.FromJSON Annotation_LayerSummary where
  parseJSON =
    Core.withObject
      "Annotation_LayerSummary"
      ( \o ->
          Annotation_LayerSummary
            Core.<$> (o Core..:? "allowedCharacterCount")
            Core.<*> (o Core..:? "limitType")
            Core.<*> (o Core..:? "remainingCharacterCount")
      )

instance Core.ToJSON Annotation_LayerSummary where
  toJSON Annotation_LayerSummary {..} =
    Core.object
      ( Core.catMaybes
          [ ("allowedCharacterCount" Core..=) Core.<$> allowedCharacterCount,
            ("limitType" Core..=) Core.<$> limitType,
            ("remainingCharacterCount" Core..=)
              Core.<$> remainingCharacterCount
          ]
      )

--
-- /See:/ 'newAnnotations' smart constructor.
data Annotations = Annotations
  { -- | A list of annotations.
    items :: (Core.Maybe [Annotation]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | Token to pass in for pagination for the next page. This will not be present if this request does not have more results.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | Total number of annotations found. This may be greater than the number of notes returned in this response if results have been paginated.
    totalItems :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Annotations' with the minimum fields required to make a request.
newAnnotations ::
  Annotations
newAnnotations =
  Annotations
    { items = Core.Nothing,
      kind = Core.Nothing,
      nextPageToken = Core.Nothing,
      totalItems = Core.Nothing
    }

instance Core.FromJSON Annotations where
  parseJSON =
    Core.withObject
      "Annotations"
      ( \o ->
          Annotations
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "totalItems")
      )

instance Core.ToJSON Annotations where
  toJSON Annotations {..} =
    Core.object
      ( Core.catMaybes
          [ ("items" Core..=) Core.<$> items,
            ("kind" Core..=) Core.<$> kind,
            ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("totalItems" Core..=) Core.<$> totalItems
          ]
      )

--
-- /See:/ 'newAnnotationsSummary' smart constructor.
data AnnotationsSummary = AnnotationsSummary
  { kind :: (Core.Maybe Core.Text),
    layers :: (Core.Maybe [AnnotationsSummary_LayersItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AnnotationsSummary' with the minimum fields required to make a request.
newAnnotationsSummary ::
  AnnotationsSummary
newAnnotationsSummary =
  AnnotationsSummary {kind = Core.Nothing, layers = Core.Nothing}

instance Core.FromJSON AnnotationsSummary where
  parseJSON =
    Core.withObject
      "AnnotationsSummary"
      ( \o ->
          AnnotationsSummary
            Core.<$> (o Core..:? "kind")
            Core.<*> (o Core..:? "layers")
      )

instance Core.ToJSON AnnotationsSummary where
  toJSON AnnotationsSummary {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("layers" Core..=) Core.<$> layers
          ]
      )

--
-- /See:/ 'newAnnotationsSummary_LayersItem' smart constructor.
data AnnotationsSummary_LayersItem = AnnotationsSummary_LayersItem
  { allowedCharacterCount :: (Core.Maybe Core.Int32),
    layerId :: (Core.Maybe Core.Text),
    limitType :: (Core.Maybe Core.Text),
    remainingCharacterCount :: (Core.Maybe Core.Int32),
    updated :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'AnnotationsSummary_LayersItem' with the minimum fields required to make a request.
newAnnotationsSummary_LayersItem ::
  AnnotationsSummary_LayersItem
newAnnotationsSummary_LayersItem =
  AnnotationsSummary_LayersItem
    { allowedCharacterCount =
        Core.Nothing,
      layerId = Core.Nothing,
      limitType = Core.Nothing,
      remainingCharacterCount = Core.Nothing,
      updated = Core.Nothing
    }

instance Core.FromJSON AnnotationsSummary_LayersItem where
  parseJSON =
    Core.withObject
      "AnnotationsSummary_LayersItem"
      ( \o ->
          AnnotationsSummary_LayersItem
            Core.<$> (o Core..:? "allowedCharacterCount")
            Core.<*> (o Core..:? "layerId")
            Core.<*> (o Core..:? "limitType")
            Core.<*> (o Core..:? "remainingCharacterCount")
            Core.<*> (o Core..:? "updated")
      )

instance Core.ToJSON AnnotationsSummary_LayersItem where
  toJSON AnnotationsSummary_LayersItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("allowedCharacterCount" Core..=) Core.<$> allowedCharacterCount,
            ("layerId" Core..=) Core.<$> layerId,
            ("limitType" Core..=) Core.<$> limitType,
            ("remainingCharacterCount" Core..=)
              Core.<$> remainingCharacterCount,
            ("updated" Core..=) Core.<$> updated
          ]
      )

--
-- /See:/ 'newAnnotationsdata' smart constructor.
data Annotationsdata = Annotationsdata
  { -- | A list of Annotation Data.
    items :: (Core.Maybe [GeoAnnotationdata]),
    -- | Resource type
    kind :: (Core.Maybe Core.Text),
    -- | Token to pass in for pagination for the next page. This will not be present if this request does not have more results.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | The total number of volume annotations found.
    totalItems :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Annotationsdata' with the minimum fields required to make a request.
newAnnotationsdata ::
  Annotationsdata
newAnnotationsdata =
  Annotationsdata
    { items = Core.Nothing,
      kind = Core.Nothing,
      nextPageToken = Core.Nothing,
      totalItems = Core.Nothing
    }

instance Core.FromJSON Annotationsdata where
  parseJSON =
    Core.withObject
      "Annotationsdata"
      ( \o ->
          Annotationsdata
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "totalItems")
      )

instance Core.ToJSON Annotationsdata where
  toJSON Annotationsdata {..} =
    Core.object
      ( Core.catMaybes
          [ ("items" Core..=) Core.<$> items,
            ("kind" Core..=) Core.<$> kind,
            ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("totalItems" Core..=) Core.<$> totalItems
          ]
      )

--
-- /See:/ 'newBooksAnnotationsRange' smart constructor.
data BooksAnnotationsRange = BooksAnnotationsRange
  { -- | The offset from the ending position.
    endOffset :: (Core.Maybe Core.Text),
    -- | The ending position for the range.
    endPosition :: (Core.Maybe Core.Text),
    -- | The offset from the starting position.
    startOffset :: (Core.Maybe Core.Text),
    -- | The starting position for the range.
    startPosition :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BooksAnnotationsRange' with the minimum fields required to make a request.
newBooksAnnotationsRange ::
  BooksAnnotationsRange
newBooksAnnotationsRange =
  BooksAnnotationsRange
    { endOffset = Core.Nothing,
      endPosition = Core.Nothing,
      startOffset = Core.Nothing,
      startPosition = Core.Nothing
    }

instance Core.FromJSON BooksAnnotationsRange where
  parseJSON =
    Core.withObject
      "BooksAnnotationsRange"
      ( \o ->
          BooksAnnotationsRange
            Core.<$> (o Core..:? "endOffset")
            Core.<*> (o Core..:? "endPosition")
            Core.<*> (o Core..:? "startOffset")
            Core.<*> (o Core..:? "startPosition")
      )

instance Core.ToJSON BooksAnnotationsRange where
  toJSON BooksAnnotationsRange {..} =
    Core.object
      ( Core.catMaybes
          [ ("endOffset" Core..=) Core.<$> endOffset,
            ("endPosition" Core..=) Core.<$> endPosition,
            ("startOffset" Core..=) Core.<$> startOffset,
            ("startPosition" Core..=) Core.<$> startPosition
          ]
      )

--
-- /See:/ 'newBooksCloudloadingResource' smart constructor.
data BooksCloudloadingResource = BooksCloudloadingResource
  { author :: (Core.Maybe Core.Text),
    processingState :: (Core.Maybe Core.Text),
    title :: (Core.Maybe Core.Text),
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BooksCloudloadingResource' with the minimum fields required to make a request.
newBooksCloudloadingResource ::
  BooksCloudloadingResource
newBooksCloudloadingResource =
  BooksCloudloadingResource
    { author = Core.Nothing,
      processingState = Core.Nothing,
      title = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON BooksCloudloadingResource where
  parseJSON =
    Core.withObject
      "BooksCloudloadingResource"
      ( \o ->
          BooksCloudloadingResource
            Core.<$> (o Core..:? "author")
            Core.<*> (o Core..:? "processingState")
            Core.<*> (o Core..:? "title")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON BooksCloudloadingResource where
  toJSON BooksCloudloadingResource {..} =
    Core.object
      ( Core.catMaybes
          [ ("author" Core..=) Core.<$> author,
            ("processingState" Core..=) Core.<$> processingState,
            ("title" Core..=) Core.<$> title,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newBooksVolumesRecommendedRateResponse' smart constructor.
newtype BooksVolumesRecommendedRateResponse = BooksVolumesRecommendedRateResponse
  { consistencyToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'BooksVolumesRecommendedRateResponse' with the minimum fields required to make a request.
newBooksVolumesRecommendedRateResponse ::
  BooksVolumesRecommendedRateResponse
newBooksVolumesRecommendedRateResponse =
  BooksVolumesRecommendedRateResponse
    { consistencyToken =
        Core.Nothing
    }

instance Core.FromJSON BooksVolumesRecommendedRateResponse where
  parseJSON =
    Core.withObject
      "BooksVolumesRecommendedRateResponse"
      ( \o ->
          BooksVolumesRecommendedRateResponse
            Core.<$> (o Core..:? "consistency_token")
      )

instance Core.ToJSON BooksVolumesRecommendedRateResponse where
  toJSON BooksVolumesRecommendedRateResponse {..} =
    Core.object
      ( Core.catMaybes
          [("consistency_token" Core..=) Core.<$> consistencyToken]
      )

--
-- /See:/ 'newBookshelf' smart constructor.
data Bookshelf = Bookshelf
  { -- | Whether this bookshelf is PUBLIC or PRIVATE.
    access :: (Core.Maybe Core.Text),
    -- | Created time for this bookshelf (formatted UTC timestamp with millisecond resolution).
    created :: (Core.Maybe Core.Text),
    -- | Description of this bookshelf.
    description :: (Core.Maybe Core.Text),
    -- | Id of this bookshelf, only unique by user.
    id :: (Core.Maybe Core.Int32),
    -- | Resource type for bookshelf metadata.
    kind :: (Core.Maybe Core.Text),
    -- | URL to this resource.
    selfLink :: (Core.Maybe Core.Text),
    -- | Title of this bookshelf.
    title :: (Core.Maybe Core.Text),
    -- | Last modified time of this bookshelf (formatted UTC timestamp with millisecond resolution).
    updated :: (Core.Maybe Core.Text),
    -- | Number of volumes in this bookshelf.
    volumeCount :: (Core.Maybe Core.Int32),
    -- | Last time a volume was added or removed from this bookshelf (formatted UTC timestamp with millisecond resolution).
    volumesLastUpdated :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Bookshelf' with the minimum fields required to make a request.
newBookshelf ::
  Bookshelf
newBookshelf =
  Bookshelf
    { access = Core.Nothing,
      created = Core.Nothing,
      description = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      selfLink = Core.Nothing,
      title = Core.Nothing,
      updated = Core.Nothing,
      volumeCount = Core.Nothing,
      volumesLastUpdated = Core.Nothing
    }

instance Core.FromJSON Bookshelf where
  parseJSON =
    Core.withObject
      "Bookshelf"
      ( \o ->
          Bookshelf
            Core.<$> (o Core..:? "access")
            Core.<*> (o Core..:? "created")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "selfLink")
            Core.<*> (o Core..:? "title")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "volumeCount")
            Core.<*> (o Core..:? "volumesLastUpdated")
      )

instance Core.ToJSON Bookshelf where
  toJSON Bookshelf {..} =
    Core.object
      ( Core.catMaybes
          [ ("access" Core..=) Core.<$> access,
            ("created" Core..=) Core.<$> created,
            ("description" Core..=) Core.<$> description,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("selfLink" Core..=) Core.<$> selfLink,
            ("title" Core..=) Core.<$> title,
            ("updated" Core..=) Core.<$> updated,
            ("volumeCount" Core..=) Core.<$> volumeCount,
            ("volumesLastUpdated" Core..=) Core.<$> volumesLastUpdated
          ]
      )

--
-- /See:/ 'newBookshelves' smart constructor.
data Bookshelves = Bookshelves
  { -- | A list of bookshelves.
    items :: (Core.Maybe [Bookshelf]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Bookshelves' with the minimum fields required to make a request.
newBookshelves ::
  Bookshelves
newBookshelves =
  Bookshelves {items = Core.Nothing, kind = Core.Nothing}

instance Core.FromJSON Bookshelves where
  parseJSON =
    Core.withObject
      "Bookshelves"
      ( \o ->
          Bookshelves
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON Bookshelves where
  toJSON Bookshelves {..} =
    Core.object
      ( Core.catMaybes
          [("items" Core..=) Core.<$> items, ("kind" Core..=) Core.<$> kind]
      )

--
-- /See:/ 'newCategory' smart constructor.
data Category = Category
  { -- | A list of onboarding categories.
    items :: (Core.Maybe [Category_ItemsItem]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Category' with the minimum fields required to make a request.
newCategory ::
  Category
newCategory = Category {items = Core.Nothing, kind = Core.Nothing}

instance Core.FromJSON Category where
  parseJSON =
    Core.withObject
      "Category"
      ( \o ->
          Category
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON Category where
  toJSON Category {..} =
    Core.object
      ( Core.catMaybes
          [("items" Core..=) Core.<$> items, ("kind" Core..=) Core.<$> kind]
      )

--
-- /See:/ 'newCategory_ItemsItem' smart constructor.
data Category_ItemsItem = Category_ItemsItem
  { badgeUrl :: (Core.Maybe Core.Text),
    categoryId :: (Core.Maybe Core.Text),
    name :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Category_ItemsItem' with the minimum fields required to make a request.
newCategory_ItemsItem ::
  Category_ItemsItem
newCategory_ItemsItem =
  Category_ItemsItem
    { badgeUrl = Core.Nothing,
      categoryId = Core.Nothing,
      name = Core.Nothing
    }

instance Core.FromJSON Category_ItemsItem where
  parseJSON =
    Core.withObject
      "Category_ItemsItem"
      ( \o ->
          Category_ItemsItem
            Core.<$> (o Core..:? "badgeUrl")
            Core.<*> (o Core..:? "categoryId")
            Core.<*> (o Core..:? "name")
      )

instance Core.ToJSON Category_ItemsItem where
  toJSON Category_ItemsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("badgeUrl" Core..=) Core.<$> badgeUrl,
            ("categoryId" Core..=) Core.<$> categoryId,
            ("name" Core..=) Core.<$> name
          ]
      )

--
-- /See:/ 'newConcurrentAccessRestriction' smart constructor.
data ConcurrentAccessRestriction = ConcurrentAccessRestriction
  { -- | Whether access is granted for this (user, device, volume).
    deviceAllowed :: (Core.Maybe Core.Bool),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | The maximum number of concurrent access licenses for this volume.
    maxConcurrentDevices :: (Core.Maybe Core.Int32),
    -- | Error\/warning message.
    message :: (Core.Maybe Core.Text),
    -- | Client nonce for verification. Download access and client-validation only.
    nonce :: (Core.Maybe Core.Text),
    -- | Error\/warning reason code.
    reasonCode :: (Core.Maybe Core.Text),
    -- | Whether this volume has any concurrent access restrictions.
    restricted :: (Core.Maybe Core.Bool),
    -- | Response signature.
    signature :: (Core.Maybe Core.Text),
    -- | Client app identifier for verification. Download access and client-validation only.
    source :: (Core.Maybe Core.Text),
    -- | Time in seconds for license auto-expiration.
    timeWindowSeconds :: (Core.Maybe Core.Int32),
    -- | Identifies the volume for which this entry applies.
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ConcurrentAccessRestriction' with the minimum fields required to make a request.
newConcurrentAccessRestriction ::
  ConcurrentAccessRestriction
newConcurrentAccessRestriction =
  ConcurrentAccessRestriction
    { deviceAllowed = Core.Nothing,
      kind = Core.Nothing,
      maxConcurrentDevices = Core.Nothing,
      message = Core.Nothing,
      nonce = Core.Nothing,
      reasonCode = Core.Nothing,
      restricted = Core.Nothing,
      signature = Core.Nothing,
      source = Core.Nothing,
      timeWindowSeconds = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON ConcurrentAccessRestriction where
  parseJSON =
    Core.withObject
      "ConcurrentAccessRestriction"
      ( \o ->
          ConcurrentAccessRestriction
            Core.<$> (o Core..:? "deviceAllowed")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "maxConcurrentDevices")
            Core.<*> (o Core..:? "message")
            Core.<*> (o Core..:? "nonce")
            Core.<*> (o Core..:? "reasonCode")
            Core.<*> (o Core..:? "restricted")
            Core.<*> (o Core..:? "signature")
            Core.<*> (o Core..:? "source")
            Core.<*> (o Core..:? "timeWindowSeconds")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON ConcurrentAccessRestriction where
  toJSON ConcurrentAccessRestriction {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceAllowed" Core..=) Core.<$> deviceAllowed,
            ("kind" Core..=) Core.<$> kind,
            ("maxConcurrentDevices" Core..=) Core.<$> maxConcurrentDevices,
            ("message" Core..=) Core.<$> message,
            ("nonce" Core..=) Core.<$> nonce,
            ("reasonCode" Core..=) Core.<$> reasonCode,
            ("restricted" Core..=) Core.<$> restricted,
            ("signature" Core..=) Core.<$> signature,
            ("source" Core..=) Core.<$> source,
            ("timeWindowSeconds" Core..=) Core.<$> timeWindowSeconds,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newDictionaryAnnotationdata' smart constructor.
data DictionaryAnnotationdata = DictionaryAnnotationdata
  { -- | The type of annotation this data is for.
    annotationType :: (Core.Maybe Core.Text),
    -- | JSON encoded data for this dictionary annotation data. Emitted with name \'data\' in JSON output. Either this or geo_data will be populated.
    data' :: (Core.Maybe Dictlayerdata),
    -- | Base64 encoded data for this annotation data.
    encodedData :: (Core.Maybe Core.Base64),
    -- | Unique id for this annotation data.
    id :: (Core.Maybe Core.Text),
    -- | Resource Type
    kind :: (Core.Maybe Core.Text),
    -- | The Layer id for this data. *
    layerId :: (Core.Maybe Core.Text),
    -- | URL for this resource. *
    selfLink :: (Core.Maybe Core.Text),
    -- | Timestamp for the last time this data was updated. (RFC 3339 UTC date-time format).
    updated :: (Core.Maybe Core.Text),
    -- | The volume id for this data. *
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DictionaryAnnotationdata' with the minimum fields required to make a request.
newDictionaryAnnotationdata ::
  DictionaryAnnotationdata
newDictionaryAnnotationdata =
  DictionaryAnnotationdata
    { annotationType = Core.Nothing,
      data' = Core.Nothing,
      encodedData = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      layerId = Core.Nothing,
      selfLink = Core.Nothing,
      updated = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON DictionaryAnnotationdata where
  parseJSON =
    Core.withObject
      "DictionaryAnnotationdata"
      ( \o ->
          DictionaryAnnotationdata
            Core.<$> (o Core..:? "annotationType")
            Core.<*> (o Core..:? "data")
            Core.<*> (o Core..:? "encodedData")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "layerId")
            Core.<*> (o Core..:? "selfLink")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON DictionaryAnnotationdata where
  toJSON DictionaryAnnotationdata {..} =
    Core.object
      ( Core.catMaybes
          [ ("annotationType" Core..=) Core.<$> annotationType,
            ("data" Core..=) Core.<$> data',
            ("encodedData" Core..=) Core.<$> encodedData,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("layerId" Core..=) Core.<$> layerId,
            ("selfLink" Core..=) Core.<$> selfLink,
            ("updated" Core..=) Core.<$> updated,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newDictlayerdata' smart constructor.
data Dictlayerdata = Dictlayerdata
  { common :: (Core.Maybe Dictlayerdata_Common),
    dict :: (Core.Maybe Dictlayerdata_Dict),
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata' with the minimum fields required to make a request.
newDictlayerdata ::
  Dictlayerdata
newDictlayerdata =
  Dictlayerdata
    { common = Core.Nothing,
      dict = Core.Nothing,
      kind = Core.Nothing
    }

instance Core.FromJSON Dictlayerdata where
  parseJSON =
    Core.withObject
      "Dictlayerdata"
      ( \o ->
          Dictlayerdata
            Core.<$> (o Core..:? "common")
            Core.<*> (o Core..:? "dict")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON Dictlayerdata where
  toJSON Dictlayerdata {..} =
    Core.object
      ( Core.catMaybes
          [ ("common" Core..=) Core.<$> common,
            ("dict" Core..=) Core.<$> dict,
            ("kind" Core..=) Core.<$> kind
          ]
      )

--
-- /See:/ 'newDictlayerdata_Common' smart constructor.
newtype Dictlayerdata_Common = Dictlayerdata_Common
  { -- | The display title and localized canonical name to use when searching for this entity on Google search.
    title :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Common' with the minimum fields required to make a request.
newDictlayerdata_Common ::
  Dictlayerdata_Common
newDictlayerdata_Common =
  Dictlayerdata_Common {title = Core.Nothing}

instance Core.FromJSON Dictlayerdata_Common where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Common"
      (\o -> Dictlayerdata_Common Core.<$> (o Core..:? "title"))

instance Core.ToJSON Dictlayerdata_Common where
  toJSON Dictlayerdata_Common {..} =
    Core.object (Core.catMaybes [("title" Core..=) Core.<$> title])

--
-- /See:/ 'newDictlayerdata_Dict' smart constructor.
data Dictlayerdata_Dict = Dictlayerdata_Dict
  { -- | The source, url and attribution for this dictionary data.
    source :: (Core.Maybe Dictlayerdata_Dict_Source),
    words :: (Core.Maybe [Dictlayerdata_Dict_WordsItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict' with the minimum fields required to make a request.
newDictlayerdata_Dict ::
  Dictlayerdata_Dict
newDictlayerdata_Dict =
  Dictlayerdata_Dict {source = Core.Nothing, words = Core.Nothing}

instance Core.FromJSON Dictlayerdata_Dict where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict"
      ( \o ->
          Dictlayerdata_Dict
            Core.<$> (o Core..:? "source")
            Core.<*> (o Core..:? "words")
      )

instance Core.ToJSON Dictlayerdata_Dict where
  toJSON Dictlayerdata_Dict {..} =
    Core.object
      ( Core.catMaybes
          [ ("source" Core..=) Core.<$> source,
            ("words" Core..=) Core.<$> words
          ]
      )

-- | The source, url and attribution for this dictionary data.
--
-- /See:/ 'newDictlayerdata_Dict_Source' smart constructor.
data Dictlayerdata_Dict_Source = Dictlayerdata_Dict_Source
  { attribution :: (Core.Maybe Core.Text),
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_Source' with the minimum fields required to make a request.
newDictlayerdata_Dict_Source ::
  Dictlayerdata_Dict_Source
newDictlayerdata_Dict_Source =
  Dictlayerdata_Dict_Source
    { attribution = Core.Nothing,
      url = Core.Nothing
    }

instance Core.FromJSON Dictlayerdata_Dict_Source where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_Source"
      ( \o ->
          Dictlayerdata_Dict_Source
            Core.<$> (o Core..:? "attribution")
            Core.<*> (o Core..:? "url")
      )

instance Core.ToJSON Dictlayerdata_Dict_Source where
  toJSON Dictlayerdata_Dict_Source {..} =
    Core.object
      ( Core.catMaybes
          [ ("attribution" Core..=) Core.<$> attribution,
            ("url" Core..=) Core.<$> url
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem' smart constructor.
data Dictlayerdata_Dict_WordsItem = Dictlayerdata_Dict_WordsItem
  { derivatives :: (Core.Maybe [Dictlayerdata_Dict_WordsItem_DerivativesItem]),
    examples :: (Core.Maybe [Dictlayerdata_Dict_WordsItem_ExamplesItem]),
    senses :: (Core.Maybe [Dictlayerdata_Dict_WordsItem_SensesItem]),
    -- | The words with different meanings but not related words, e.g. \"go\" (game) and \"go\" (verb).
    source :: (Core.Maybe Dictlayerdata_Dict_WordsItem_Source)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem ::
  Dictlayerdata_Dict_WordsItem
newDictlayerdata_Dict_WordsItem =
  Dictlayerdata_Dict_WordsItem
    { derivatives = Core.Nothing,
      examples = Core.Nothing,
      senses = Core.Nothing,
      source = Core.Nothing
    }

instance Core.FromJSON Dictlayerdata_Dict_WordsItem where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem
            Core.<$> (o Core..:? "derivatives")
            Core.<*> (o Core..:? "examples")
            Core.<*> (o Core..:? "senses")
            Core.<*> (o Core..:? "source")
      )

instance Core.ToJSON Dictlayerdata_Dict_WordsItem where
  toJSON Dictlayerdata_Dict_WordsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("derivatives" Core..=) Core.<$> derivatives,
            ("examples" Core..=) Core.<$> examples,
            ("senses" Core..=) Core.<$> senses,
            ("source" Core..=) Core.<$> source
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_DerivativesItem' smart constructor.
data Dictlayerdata_Dict_WordsItem_DerivativesItem = Dictlayerdata_Dict_WordsItem_DerivativesItem
  { source :: (Core.Maybe Dictlayerdata_Dict_WordsItem_DerivativesItem_Source),
    text :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_DerivativesItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_DerivativesItem ::
  Dictlayerdata_Dict_WordsItem_DerivativesItem
newDictlayerdata_Dict_WordsItem_DerivativesItem =
  Dictlayerdata_Dict_WordsItem_DerivativesItem
    { source =
        Core.Nothing,
      text = Core.Nothing
    }

instance Core.FromJSON Dictlayerdata_Dict_WordsItem_DerivativesItem where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_DerivativesItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_DerivativesItem
            Core.<$> (o Core..:? "source")
            Core.<*> (o Core..:? "text")
      )

instance Core.ToJSON Dictlayerdata_Dict_WordsItem_DerivativesItem where
  toJSON Dictlayerdata_Dict_WordsItem_DerivativesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("source" Core..=) Core.<$> source,
            ("text" Core..=) Core.<$> text
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_DerivativesItem_Source' smart constructor.
data Dictlayerdata_Dict_WordsItem_DerivativesItem_Source = Dictlayerdata_Dict_WordsItem_DerivativesItem_Source
  { attribution :: (Core.Maybe Core.Text),
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_DerivativesItem_Source' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_DerivativesItem_Source ::
  Dictlayerdata_Dict_WordsItem_DerivativesItem_Source
newDictlayerdata_Dict_WordsItem_DerivativesItem_Source =
  Dictlayerdata_Dict_WordsItem_DerivativesItem_Source
    { attribution =
        Core.Nothing,
      url = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_DerivativesItem_Source
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_DerivativesItem_Source"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_DerivativesItem_Source
            Core.<$> (o Core..:? "attribution")
            Core.<*> (o Core..:? "url")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_DerivativesItem_Source
  where
  toJSON Dictlayerdata_Dict_WordsItem_DerivativesItem_Source {..} =
    Core.object
      ( Core.catMaybes
          [ ("attribution" Core..=) Core.<$> attribution,
            ("url" Core..=) Core.<$> url
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_ExamplesItem' smart constructor.
data Dictlayerdata_Dict_WordsItem_ExamplesItem = Dictlayerdata_Dict_WordsItem_ExamplesItem
  { source :: (Core.Maybe Dictlayerdata_Dict_WordsItem_ExamplesItem_Source),
    text :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_ExamplesItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_ExamplesItem ::
  Dictlayerdata_Dict_WordsItem_ExamplesItem
newDictlayerdata_Dict_WordsItem_ExamplesItem =
  Dictlayerdata_Dict_WordsItem_ExamplesItem
    { source = Core.Nothing,
      text = Core.Nothing
    }

instance Core.FromJSON Dictlayerdata_Dict_WordsItem_ExamplesItem where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_ExamplesItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_ExamplesItem
            Core.<$> (o Core..:? "source")
            Core.<*> (o Core..:? "text")
      )

instance Core.ToJSON Dictlayerdata_Dict_WordsItem_ExamplesItem where
  toJSON Dictlayerdata_Dict_WordsItem_ExamplesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("source" Core..=) Core.<$> source,
            ("text" Core..=) Core.<$> text
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_ExamplesItem_Source' smart constructor.
data Dictlayerdata_Dict_WordsItem_ExamplesItem_Source = Dictlayerdata_Dict_WordsItem_ExamplesItem_Source
  { attribution :: (Core.Maybe Core.Text),
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_ExamplesItem_Source' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_ExamplesItem_Source ::
  Dictlayerdata_Dict_WordsItem_ExamplesItem_Source
newDictlayerdata_Dict_WordsItem_ExamplesItem_Source =
  Dictlayerdata_Dict_WordsItem_ExamplesItem_Source
    { attribution =
        Core.Nothing,
      url = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_ExamplesItem_Source
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_ExamplesItem_Source"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_ExamplesItem_Source
            Core.<$> (o Core..:? "attribution")
            Core.<*> (o Core..:? "url")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_ExamplesItem_Source
  where
  toJSON Dictlayerdata_Dict_WordsItem_ExamplesItem_Source {..} =
    Core.object
      ( Core.catMaybes
          [ ("attribution" Core..=) Core.<$> attribution,
            ("url" Core..=) Core.<$> url
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem = Dictlayerdata_Dict_WordsItem_SensesItem
  { conjugations ::
      ( Core.Maybe
          [Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem]
      ),
    definitions ::
      ( Core.Maybe
          [Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem]
      ),
    partOfSpeech :: (Core.Maybe Core.Text),
    pronunciation :: (Core.Maybe Core.Text),
    pronunciationUrl :: (Core.Maybe Core.Text),
    source :: (Core.Maybe Dictlayerdata_Dict_WordsItem_SensesItem_Source),
    syllabification :: (Core.Maybe Core.Text),
    synonyms :: (Core.Maybe [Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem ::
  Dictlayerdata_Dict_WordsItem_SensesItem
newDictlayerdata_Dict_WordsItem_SensesItem =
  Dictlayerdata_Dict_WordsItem_SensesItem
    { conjugations =
        Core.Nothing,
      definitions = Core.Nothing,
      partOfSpeech = Core.Nothing,
      pronunciation = Core.Nothing,
      pronunciationUrl = Core.Nothing,
      source = Core.Nothing,
      syllabification = Core.Nothing,
      synonyms = Core.Nothing
    }

instance Core.FromJSON Dictlayerdata_Dict_WordsItem_SensesItem where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem
            Core.<$> (o Core..:? "conjugations")
            Core.<*> (o Core..:? "definitions")
            Core.<*> (o Core..:? "partOfSpeech")
            Core.<*> (o Core..:? "pronunciation")
            Core.<*> (o Core..:? "pronunciationUrl")
            Core.<*> (o Core..:? "source")
            Core.<*> (o Core..:? "syllabification")
            Core.<*> (o Core..:? "synonyms")
      )

instance Core.ToJSON Dictlayerdata_Dict_WordsItem_SensesItem where
  toJSON Dictlayerdata_Dict_WordsItem_SensesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("conjugations" Core..=) Core.<$> conjugations,
            ("definitions" Core..=) Core.<$> definitions,
            ("partOfSpeech" Core..=) Core.<$> partOfSpeech,
            ("pronunciation" Core..=) Core.<$> pronunciation,
            ("pronunciationUrl" Core..=) Core.<$> pronunciationUrl,
            ("source" Core..=) Core.<$> source,
            ("syllabification" Core..=) Core.<$> syllabification,
            ("synonyms" Core..=) Core.<$> synonyms
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem = Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem
  { type' :: (Core.Maybe Core.Text),
    value :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem ::
  Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem
newDictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem =
  Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem
    { type' =
        Core.Nothing,
      value = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem
            Core.<$> (o Core..:? "type")
            Core.<*> (o Core..:? "value")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem
  where
  toJSON Dictlayerdata_Dict_WordsItem_SensesItem_ConjugationsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("type" Core..=) Core.<$> type',
            ("value" Core..=) Core.<$> value
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem = Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem
  { definition :: (Core.Maybe Core.Text),
    examples ::
      ( Core.Maybe
          [Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem]
      )
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem ::
  Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem
newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem =
  Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem
    { definition =
        Core.Nothing,
      examples = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem
            Core.<$> (o Core..:? "definition")
            Core.<*> (o Core..:? "examples")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem
  where
  toJSON Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("definition" Core..=) Core.<$> definition,
            ("examples" Core..=) Core.<$> examples
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem = Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem
  { source ::
      ( Core.Maybe
          Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
      ),
    text :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem ::
  Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem
newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem =
  Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem
    { source =
        Core.Nothing,
      text = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem
            Core.<$> (o Core..:? "source")
            Core.<*> (o Core..:? "text")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem
  where
  toJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem {..} =
      Core.object
        ( Core.catMaybes
            [ ("source" Core..=) Core.<$> source,
              ("text" Core..=) Core.<$> text
            ]
        )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source = Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
  { attribution :: (Core.Maybe Core.Text),
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source ::
  Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
newDictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source =
  Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
    { attribution =
        Core.Nothing,
      url = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
            Core.<$> (o Core..:? "attribution")
            Core.<*> (o Core..:? "url")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source
  where
  toJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_DefinitionsItem_ExamplesItem_Source {..} =
      Core.object
        ( Core.catMaybes
            [ ("attribution" Core..=) Core.<$> attribution,
              ("url" Core..=) Core.<$> url
            ]
        )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem_Source' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem_Source = Dictlayerdata_Dict_WordsItem_SensesItem_Source
  { attribution :: (Core.Maybe Core.Text),
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem_Source' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem_Source ::
  Dictlayerdata_Dict_WordsItem_SensesItem_Source
newDictlayerdata_Dict_WordsItem_SensesItem_Source =
  Dictlayerdata_Dict_WordsItem_SensesItem_Source
    { attribution =
        Core.Nothing,
      url = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_Source
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem_Source"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem_Source
            Core.<$> (o Core..:? "attribution")
            Core.<*> (o Core..:? "url")
      )

instance Core.ToJSON Dictlayerdata_Dict_WordsItem_SensesItem_Source where
  toJSON Dictlayerdata_Dict_WordsItem_SensesItem_Source {..} =
    Core.object
      ( Core.catMaybes
          [ ("attribution" Core..=) Core.<$> attribution,
            ("url" Core..=) Core.<$> url
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem = Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem
  { source ::
      ( Core.Maybe
          Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
      ),
    text :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem ::
  Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem
newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem =
  Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem
    { source =
        Core.Nothing,
      text = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem
            Core.<$> (o Core..:? "source")
            Core.<*> (o Core..:? "text")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem
  where
  toJSON Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("source" Core..=) Core.<$> source,
            ("text" Core..=) Core.<$> text
          ]
      )

--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source' smart constructor.
data Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source = Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
  { attribution :: (Core.Maybe Core.Text),
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source ::
  Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
newDictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source =
  Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
    { attribution =
        Core.Nothing,
      url = Core.Nothing
    }

instance
  Core.FromJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
  where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
            Core.<$> (o Core..:? "attribution")
            Core.<*> (o Core..:? "url")
      )

instance
  Core.ToJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source
  where
  toJSON
    Dictlayerdata_Dict_WordsItem_SensesItem_SynonymsItem_Source {..} =
      Core.object
        ( Core.catMaybes
            [ ("attribution" Core..=) Core.<$> attribution,
              ("url" Core..=) Core.<$> url
            ]
        )

-- | The words with different meanings but not related words, e.g. \"go\" (game) and \"go\" (verb).
--
-- /See:/ 'newDictlayerdata_Dict_WordsItem_Source' smart constructor.
data Dictlayerdata_Dict_WordsItem_Source = Dictlayerdata_Dict_WordsItem_Source
  { attribution :: (Core.Maybe Core.Text),
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Dictlayerdata_Dict_WordsItem_Source' with the minimum fields required to make a request.
newDictlayerdata_Dict_WordsItem_Source ::
  Dictlayerdata_Dict_WordsItem_Source
newDictlayerdata_Dict_WordsItem_Source =
  Dictlayerdata_Dict_WordsItem_Source
    { attribution = Core.Nothing,
      url = Core.Nothing
    }

instance Core.FromJSON Dictlayerdata_Dict_WordsItem_Source where
  parseJSON =
    Core.withObject
      "Dictlayerdata_Dict_WordsItem_Source"
      ( \o ->
          Dictlayerdata_Dict_WordsItem_Source
            Core.<$> (o Core..:? "attribution")
            Core.<*> (o Core..:? "url")
      )

instance Core.ToJSON Dictlayerdata_Dict_WordsItem_Source where
  toJSON Dictlayerdata_Dict_WordsItem_Source {..} =
    Core.object
      ( Core.catMaybes
          [ ("attribution" Core..=) Core.<$> attribution,
            ("url" Core..=) Core.<$> url
          ]
      )

--
-- /See:/ 'newDiscoveryclusters' smart constructor.
data Discoveryclusters = Discoveryclusters
  { clusters :: (Core.Maybe [Discoveryclusters_ClustersItem]),
    -- | Resorce type.
    kind :: (Core.Maybe Core.Text),
    totalClusters :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Discoveryclusters' with the minimum fields required to make a request.
newDiscoveryclusters ::
  Discoveryclusters
newDiscoveryclusters =
  Discoveryclusters
    { clusters = Core.Nothing,
      kind = Core.Nothing,
      totalClusters = Core.Nothing
    }

instance Core.FromJSON Discoveryclusters where
  parseJSON =
    Core.withObject
      "Discoveryclusters"
      ( \o ->
          Discoveryclusters
            Core.<$> (o Core..:? "clusters")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "totalClusters")
      )

instance Core.ToJSON Discoveryclusters where
  toJSON Discoveryclusters {..} =
    Core.object
      ( Core.catMaybes
          [ ("clusters" Core..=) Core.<$> clusters,
            ("kind" Core..=) Core.<$> kind,
            ("totalClusters" Core..=) Core.<$> totalClusters
          ]
      )

--
-- /See:/ 'newDiscoveryclusters_ClustersItem' smart constructor.
data Discoveryclusters_ClustersItem = Discoveryclusters_ClustersItem
  { bannerWithContentContainer ::
      ( Core.Maybe
          Discoveryclusters_ClustersItem_Banner_with_content_container
      ),
    subTitle :: (Core.Maybe Core.Text),
    title :: (Core.Maybe Core.Text),
    totalVolumes :: (Core.Maybe Core.Int32),
    uid :: (Core.Maybe Core.Text),
    volumes :: (Core.Maybe [Volume])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Discoveryclusters_ClustersItem' with the minimum fields required to make a request.
newDiscoveryclusters_ClustersItem ::
  Discoveryclusters_ClustersItem
newDiscoveryclusters_ClustersItem =
  Discoveryclusters_ClustersItem
    { bannerWithContentContainer =
        Core.Nothing,
      subTitle = Core.Nothing,
      title = Core.Nothing,
      totalVolumes = Core.Nothing,
      uid = Core.Nothing,
      volumes = Core.Nothing
    }

instance Core.FromJSON Discoveryclusters_ClustersItem where
  parseJSON =
    Core.withObject
      "Discoveryclusters_ClustersItem"
      ( \o ->
          Discoveryclusters_ClustersItem
            Core.<$> (o Core..:? "banner_with_content_container")
            Core.<*> (o Core..:? "subTitle")
            Core.<*> (o Core..:? "title")
            Core.<*> (o Core..:? "totalVolumes")
            Core.<*> (o Core..:? "uid")
            Core.<*> (o Core..:? "volumes")
      )

instance Core.ToJSON Discoveryclusters_ClustersItem where
  toJSON Discoveryclusters_ClustersItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("banner_with_content_container" Core..=)
              Core.<$> bannerWithContentContainer,
            ("subTitle" Core..=) Core.<$> subTitle,
            ("title" Core..=) Core.<$> title,
            ("totalVolumes" Core..=) Core.<$> totalVolumes,
            ("uid" Core..=) Core.<$> uid,
            ("volumes" Core..=) Core.<$> volumes
          ]
      )

--
-- /See:/ 'newDiscoveryclusters_ClustersItem_Banner_with_content_container' smart constructor.
data Discoveryclusters_ClustersItem_Banner_with_content_container = Discoveryclusters_ClustersItem_Banner_with_content_container
  { fillColorArgb :: (Core.Maybe Core.Text),
    imageUrl :: (Core.Maybe Core.Text),
    maskColorArgb :: (Core.Maybe Core.Text),
    moreButtonText :: (Core.Maybe Core.Text),
    moreButtonUrl :: (Core.Maybe Core.Text),
    textColorArgb :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Discoveryclusters_ClustersItem_Banner_with_content_container' with the minimum fields required to make a request.
newDiscoveryclusters_ClustersItem_Banner_with_content_container ::
  Discoveryclusters_ClustersItem_Banner_with_content_container
newDiscoveryclusters_ClustersItem_Banner_with_content_container =
  Discoveryclusters_ClustersItem_Banner_with_content_container
    { fillColorArgb =
        Core.Nothing,
      imageUrl = Core.Nothing,
      maskColorArgb = Core.Nothing,
      moreButtonText = Core.Nothing,
      moreButtonUrl = Core.Nothing,
      textColorArgb = Core.Nothing
    }

instance
  Core.FromJSON
    Discoveryclusters_ClustersItem_Banner_with_content_container
  where
  parseJSON =
    Core.withObject
      "Discoveryclusters_ClustersItem_Banner_with_content_container"
      ( \o ->
          Discoveryclusters_ClustersItem_Banner_with_content_container
            Core.<$> (o Core..:? "fillColorArgb")
            Core.<*> (o Core..:? "imageUrl")
            Core.<*> (o Core..:? "maskColorArgb")
            Core.<*> (o Core..:? "moreButtonText")
            Core.<*> (o Core..:? "moreButtonUrl")
            Core.<*> (o Core..:? "textColorArgb")
      )

instance
  Core.ToJSON
    Discoveryclusters_ClustersItem_Banner_with_content_container
  where
  toJSON
    Discoveryclusters_ClustersItem_Banner_with_content_container {..} =
      Core.object
        ( Core.catMaybes
            [ ("fillColorArgb" Core..=) Core.<$> fillColorArgb,
              ("imageUrl" Core..=) Core.<$> imageUrl,
              ("maskColorArgb" Core..=) Core.<$> maskColorArgb,
              ("moreButtonText" Core..=) Core.<$> moreButtonText,
              ("moreButtonUrl" Core..=) Core.<$> moreButtonUrl,
              ("textColorArgb" Core..=) Core.<$> textColorArgb
            ]
        )

--
-- /See:/ 'newDownloadAccessRestriction' smart constructor.
data DownloadAccessRestriction = DownloadAccessRestriction
  { -- | If restricted, whether access is granted for this (user, device, volume).
    deviceAllowed :: (Core.Maybe Core.Bool),
    -- | If restricted, the number of content download licenses already acquired (including the requesting client, if licensed).
    downloadsAcquired :: (Core.Maybe Core.Int32),
    -- | If deviceAllowed, whether access was just acquired with this request.
    justAcquired :: (Core.Maybe Core.Bool),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | If restricted, the maximum number of content download licenses for this volume.
    maxDownloadDevices :: (Core.Maybe Core.Int32),
    -- | Error\/warning message.
    message :: (Core.Maybe Core.Text),
    -- | Client nonce for verification. Download access and client-validation only.
    nonce :: (Core.Maybe Core.Text),
    -- | Error\/warning reason code. Additional codes may be added in the future. 0 OK 100 ACCESS/DENIED/PUBLISHER/LIMIT 101 ACCESS/DENIED/LIMIT 200 WARNING/USED/LAST/ACCESS
    reasonCode :: (Core.Maybe Core.Text),
    -- | Whether this volume has any download access restrictions.
    restricted :: (Core.Maybe Core.Bool),
    -- | Response signature.
    signature :: (Core.Maybe Core.Text),
    -- | Client app identifier for verification. Download access and client-validation only.
    source :: (Core.Maybe Core.Text),
    -- | Identifies the volume for which this entry applies.
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DownloadAccessRestriction' with the minimum fields required to make a request.
newDownloadAccessRestriction ::
  DownloadAccessRestriction
newDownloadAccessRestriction =
  DownloadAccessRestriction
    { deviceAllowed = Core.Nothing,
      downloadsAcquired = Core.Nothing,
      justAcquired = Core.Nothing,
      kind = Core.Nothing,
      maxDownloadDevices = Core.Nothing,
      message = Core.Nothing,
      nonce = Core.Nothing,
      reasonCode = Core.Nothing,
      restricted = Core.Nothing,
      signature = Core.Nothing,
      source = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON DownloadAccessRestriction where
  parseJSON =
    Core.withObject
      "DownloadAccessRestriction"
      ( \o ->
          DownloadAccessRestriction
            Core.<$> (o Core..:? "deviceAllowed")
            Core.<*> (o Core..:? "downloadsAcquired")
            Core.<*> (o Core..:? "justAcquired")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "maxDownloadDevices")
            Core.<*> (o Core..:? "message")
            Core.<*> (o Core..:? "nonce")
            Core.<*> (o Core..:? "reasonCode")
            Core.<*> (o Core..:? "restricted")
            Core.<*> (o Core..:? "signature")
            Core.<*> (o Core..:? "source")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON DownloadAccessRestriction where
  toJSON DownloadAccessRestriction {..} =
    Core.object
      ( Core.catMaybes
          [ ("deviceAllowed" Core..=) Core.<$> deviceAllowed,
            ("downloadsAcquired" Core..=) Core.<$> downloadsAcquired,
            ("justAcquired" Core..=) Core.<$> justAcquired,
            ("kind" Core..=) Core.<$> kind,
            ("maxDownloadDevices" Core..=) Core.<$> maxDownloadDevices,
            ("message" Core..=) Core.<$> message,
            ("nonce" Core..=) Core.<$> nonce,
            ("reasonCode" Core..=) Core.<$> reasonCode,
            ("restricted" Core..=) Core.<$> restricted,
            ("signature" Core..=) Core.<$> signature,
            ("source" Core..=) Core.<$> source,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newDownloadAccesses' smart constructor.
data DownloadAccesses = DownloadAccesses
  { -- | A list of download access responses.
    downloadAccessList :: (Core.Maybe [DownloadAccessRestriction]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'DownloadAccesses' with the minimum fields required to make a request.
newDownloadAccesses ::
  DownloadAccesses
newDownloadAccesses =
  DownloadAccesses
    { downloadAccessList = Core.Nothing,
      kind = Core.Nothing
    }

instance Core.FromJSON DownloadAccesses where
  parseJSON =
    Core.withObject
      "DownloadAccesses"
      ( \o ->
          DownloadAccesses
            Core.<$> (o Core..:? "downloadAccessList")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON DownloadAccesses where
  toJSON DownloadAccesses {..} =
    Core.object
      ( Core.catMaybes
          [ ("downloadAccessList" Core..=) Core.<$> downloadAccessList,
            ("kind" Core..=) Core.<$> kind
          ]
      )

-- | A generic empty message that you can re-use to avoid defining duplicated empty messages in your APIs. A typical example is to use it as the request or the response type of an API method. For instance: service Foo { rpc Bar(google.protobuf.Empty) returns (google.protobuf.Empty); }
--
-- /See:/ 'newEmpty' smart constructor.
data Empty = Empty
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Empty' with the minimum fields required to make a request.
newEmpty ::
  Empty
newEmpty = Empty

instance Core.FromJSON Empty where
  parseJSON = Core.withObject "Empty" (\o -> Core.pure Empty)

instance Core.ToJSON Empty where
  toJSON = Core.const Core.emptyObject

--
-- /See:/ 'newFamilyInfo' smart constructor.
data FamilyInfo = FamilyInfo
  { -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | Family membership info of the user that made the request.
    membership :: (Core.Maybe FamilyInfo_Membership)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'FamilyInfo' with the minimum fields required to make a request.
newFamilyInfo ::
  FamilyInfo
newFamilyInfo =
  FamilyInfo {kind = Core.Nothing, membership = Core.Nothing}

instance Core.FromJSON FamilyInfo where
  parseJSON =
    Core.withObject
      "FamilyInfo"
      ( \o ->
          FamilyInfo
            Core.<$> (o Core..:? "kind")
            Core.<*> (o Core..:? "membership")
      )

instance Core.ToJSON FamilyInfo where
  toJSON FamilyInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("membership" Core..=) Core.<$> membership
          ]
      )

-- | Family membership info of the user that made the request.
--
-- /See:/ 'newFamilyInfo_Membership' smart constructor.
data FamilyInfo_Membership = FamilyInfo_Membership
  { -- | Restrictions on user buying and acquiring content.
    acquirePermission :: (Core.Maybe Core.Text),
    -- | The age group of the user.
    ageGroup :: (Core.Maybe Core.Text),
    -- | The maximum allowed maturity rating for the user.
    allowedMaturityRating :: (Core.Maybe Core.Text),
    isInFamily :: (Core.Maybe Core.Bool),
    -- | The role of the user in the family.
    role' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'FamilyInfo_Membership' with the minimum fields required to make a request.
newFamilyInfo_Membership ::
  FamilyInfo_Membership
newFamilyInfo_Membership =
  FamilyInfo_Membership
    { acquirePermission = Core.Nothing,
      ageGroup = Core.Nothing,
      allowedMaturityRating = Core.Nothing,
      isInFamily = Core.Nothing,
      role' = Core.Nothing
    }

instance Core.FromJSON FamilyInfo_Membership where
  parseJSON =
    Core.withObject
      "FamilyInfo_Membership"
      ( \o ->
          FamilyInfo_Membership
            Core.<$> (o Core..:? "acquirePermission")
            Core.<*> (o Core..:? "ageGroup")
            Core.<*> (o Core..:? "allowedMaturityRating")
            Core.<*> (o Core..:? "isInFamily")
            Core.<*> (o Core..:? "role")
      )

instance Core.ToJSON FamilyInfo_Membership where
  toJSON FamilyInfo_Membership {..} =
    Core.object
      ( Core.catMaybes
          [ ("acquirePermission" Core..=) Core.<$> acquirePermission,
            ("ageGroup" Core..=) Core.<$> ageGroup,
            ("allowedMaturityRating" Core..=) Core.<$> allowedMaturityRating,
            ("isInFamily" Core..=) Core.<$> isInFamily,
            ("role" Core..=) Core.<$> role'
          ]
      )

--
-- /See:/ 'newGeoAnnotationdata' smart constructor.
data GeoAnnotationdata = GeoAnnotationdata
  { -- | The type of annotation this data is for.
    annotationType :: (Core.Maybe Core.Text),
    -- | JSON encoded data for this geo annotation data. Emitted with name \'data\' in JSON output. Either this or dict_data will be populated.
    data' :: (Core.Maybe Geolayerdata),
    -- | Base64 encoded data for this annotation data.
    encodedData :: (Core.Maybe Core.Base64),
    -- | Unique id for this annotation data.
    id :: (Core.Maybe Core.Text),
    -- | Resource Type
    kind :: (Core.Maybe Core.Text),
    -- | The Layer id for this data. *
    layerId :: (Core.Maybe Core.Text),
    -- | URL for this resource. *
    selfLink :: (Core.Maybe Core.Text),
    -- | Timestamp for the last time this data was updated. (RFC 3339 UTC date-time format).
    updated :: (Core.Maybe Core.Text),
    -- | The volume id for this data. *
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'GeoAnnotationdata' with the minimum fields required to make a request.
newGeoAnnotationdata ::
  GeoAnnotationdata
newGeoAnnotationdata =
  GeoAnnotationdata
    { annotationType = Core.Nothing,
      data' = Core.Nothing,
      encodedData = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      layerId = Core.Nothing,
      selfLink = Core.Nothing,
      updated = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON GeoAnnotationdata where
  parseJSON =
    Core.withObject
      "GeoAnnotationdata"
      ( \o ->
          GeoAnnotationdata
            Core.<$> (o Core..:? "annotationType")
            Core.<*> (o Core..:? "data")
            Core.<*> (o Core..:? "encodedData")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "layerId")
            Core.<*> (o Core..:? "selfLink")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON GeoAnnotationdata where
  toJSON GeoAnnotationdata {..} =
    Core.object
      ( Core.catMaybes
          [ ("annotationType" Core..=) Core.<$> annotationType,
            ("data" Core..=) Core.<$> data',
            ("encodedData" Core..=) Core.<$> encodedData,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("layerId" Core..=) Core.<$> layerId,
            ("selfLink" Core..=) Core.<$> selfLink,
            ("updated" Core..=) Core.<$> updated,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newGeolayerdata' smart constructor.
data Geolayerdata = Geolayerdata
  { common :: (Core.Maybe Geolayerdata_Common),
    geo :: (Core.Maybe Geolayerdata_Geo),
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Geolayerdata' with the minimum fields required to make a request.
newGeolayerdata ::
  Geolayerdata
newGeolayerdata =
  Geolayerdata
    { common = Core.Nothing,
      geo = Core.Nothing,
      kind = Core.Nothing
    }

instance Core.FromJSON Geolayerdata where
  parseJSON =
    Core.withObject
      "Geolayerdata"
      ( \o ->
          Geolayerdata
            Core.<$> (o Core..:? "common")
            Core.<*> (o Core..:? "geo")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON Geolayerdata where
  toJSON Geolayerdata {..} =
    Core.object
      ( Core.catMaybes
          [ ("common" Core..=) Core.<$> common,
            ("geo" Core..=) Core.<$> geo,
            ("kind" Core..=) Core.<$> kind
          ]
      )

--
-- /See:/ 'newGeolayerdata_Common' smart constructor.
data Geolayerdata_Common = Geolayerdata_Common
  { -- | The language of the information url and description.
    lang :: (Core.Maybe Core.Text),
    -- | The URL for the preview image information.
    previewImageUrl :: (Core.Maybe Core.Text),
    -- | The description for this location.
    snippet :: (Core.Maybe Core.Text),
    -- | The URL for information for this location. Ex: wikipedia link.
    snippetUrl :: (Core.Maybe Core.Text),
    -- | The display title and localized canonical name to use when searching for this entity on Google search.
    title :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Geolayerdata_Common' with the minimum fields required to make a request.
newGeolayerdata_Common ::
  Geolayerdata_Common
newGeolayerdata_Common =
  Geolayerdata_Common
    { lang = Core.Nothing,
      previewImageUrl = Core.Nothing,
      snippet = Core.Nothing,
      snippetUrl = Core.Nothing,
      title = Core.Nothing
    }

instance Core.FromJSON Geolayerdata_Common where
  parseJSON =
    Core.withObject
      "Geolayerdata_Common"
      ( \o ->
          Geolayerdata_Common
            Core.<$> (o Core..:? "lang")
            Core.<*> (o Core..:? "previewImageUrl")
            Core.<*> (o Core..:? "snippet")
            Core.<*> (o Core..:? "snippetUrl")
            Core.<*> (o Core..:? "title")
      )

instance Core.ToJSON Geolayerdata_Common where
  toJSON Geolayerdata_Common {..} =
    Core.object
      ( Core.catMaybes
          [ ("lang" Core..=) Core.<$> lang,
            ("previewImageUrl" Core..=) Core.<$> previewImageUrl,
            ("snippet" Core..=) Core.<$> snippet,
            ("snippetUrl" Core..=) Core.<$> snippetUrl,
            ("title" Core..=) Core.<$> title
          ]
      )

--
-- /See:/ 'newGeolayerdata_Geo' smart constructor.
data Geolayerdata_Geo = Geolayerdata_Geo
  { -- | The boundary of the location as a set of loops containing pairs of latitude, longitude coordinates.
    boundary :: (Core.Maybe [Core.Text]),
    -- | The cache policy active for this data. EX: UNRESTRICTED, RESTRICTED, NEVER
    cachePolicy :: (Core.Maybe Core.Text),
    -- | The country code of the location.
    countryCode :: (Core.Maybe Core.Text),
    -- | The latitude of the location.
    latitude :: (Core.Maybe Core.Double),
    -- | The longitude of the location.
    longitude :: (Core.Maybe Core.Double),
    -- | The type of map that should be used for this location. EX: HYBRID, ROADMAP, SATELLITE, TERRAIN
    mapType :: (Core.Maybe Core.Text),
    -- | The viewport for showing this location. This is a latitude, longitude rectangle.
    viewport :: (Core.Maybe Geolayerdata_Geo_Viewport),
    -- | The Zoom level to use for the map. Zoom levels between 0 (the lowest zoom level, in which the entire world can be seen on one map) to 21+ (down to individual buildings). See: https: \/\/developers.google.com\/maps\/documentation\/staticmaps\/#Zoomlevels
    zoom :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Geolayerdata_Geo' with the minimum fields required to make a request.
newGeolayerdata_Geo ::
  Geolayerdata_Geo
newGeolayerdata_Geo =
  Geolayerdata_Geo
    { boundary = Core.Nothing,
      cachePolicy = Core.Nothing,
      countryCode = Core.Nothing,
      latitude = Core.Nothing,
      longitude = Core.Nothing,
      mapType = Core.Nothing,
      viewport = Core.Nothing,
      zoom = Core.Nothing
    }

instance Core.FromJSON Geolayerdata_Geo where
  parseJSON =
    Core.withObject
      "Geolayerdata_Geo"
      ( \o ->
          Geolayerdata_Geo
            Core.<$> (o Core..:? "boundary")
            Core.<*> (o Core..:? "cachePolicy")
            Core.<*> (o Core..:? "countryCode")
            Core.<*> (o Core..:? "latitude")
            Core.<*> (o Core..:? "longitude")
            Core.<*> (o Core..:? "mapType")
            Core.<*> (o Core..:? "viewport")
            Core.<*> (o Core..:? "zoom")
      )

instance Core.ToJSON Geolayerdata_Geo where
  toJSON Geolayerdata_Geo {..} =
    Core.object
      ( Core.catMaybes
          [ ("boundary" Core..=) Core.<$> boundary,
            ("cachePolicy" Core..=) Core.<$> cachePolicy,
            ("countryCode" Core..=) Core.<$> countryCode,
            ("latitude" Core..=) Core.<$> latitude,
            ("longitude" Core..=) Core.<$> longitude,
            ("mapType" Core..=) Core.<$> mapType,
            ("viewport" Core..=) Core.<$> viewport,
            ("zoom" Core..=) Core.<$> zoom
          ]
      )

-- | The viewport for showing this location. This is a latitude, longitude rectangle.
--
-- /See:/ 'newGeolayerdata_Geo_Viewport' smart constructor.
data Geolayerdata_Geo_Viewport = Geolayerdata_Geo_Viewport
  { hi :: (Core.Maybe Geolayerdata_Geo_Viewport_Hi),
    lo :: (Core.Maybe Geolayerdata_Geo_Viewport_Lo)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Geolayerdata_Geo_Viewport' with the minimum fields required to make a request.
newGeolayerdata_Geo_Viewport ::
  Geolayerdata_Geo_Viewport
newGeolayerdata_Geo_Viewport =
  Geolayerdata_Geo_Viewport {hi = Core.Nothing, lo = Core.Nothing}

instance Core.FromJSON Geolayerdata_Geo_Viewport where
  parseJSON =
    Core.withObject
      "Geolayerdata_Geo_Viewport"
      ( \o ->
          Geolayerdata_Geo_Viewport
            Core.<$> (o Core..:? "hi")
            Core.<*> (o Core..:? "lo")
      )

instance Core.ToJSON Geolayerdata_Geo_Viewport where
  toJSON Geolayerdata_Geo_Viewport {..} =
    Core.object
      ( Core.catMaybes
          [("hi" Core..=) Core.<$> hi, ("lo" Core..=) Core.<$> lo]
      )

--
-- /See:/ 'newGeolayerdata_Geo_Viewport_Hi' smart constructor.
data Geolayerdata_Geo_Viewport_Hi = Geolayerdata_Geo_Viewport_Hi
  { latitude :: (Core.Maybe Core.Double),
    longitude :: (Core.Maybe Core.Double)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Geolayerdata_Geo_Viewport_Hi' with the minimum fields required to make a request.
newGeolayerdata_Geo_Viewport_Hi ::
  Geolayerdata_Geo_Viewport_Hi
newGeolayerdata_Geo_Viewport_Hi =
  Geolayerdata_Geo_Viewport_Hi
    { latitude = Core.Nothing,
      longitude = Core.Nothing
    }

instance Core.FromJSON Geolayerdata_Geo_Viewport_Hi where
  parseJSON =
    Core.withObject
      "Geolayerdata_Geo_Viewport_Hi"
      ( \o ->
          Geolayerdata_Geo_Viewport_Hi
            Core.<$> (o Core..:? "latitude")
            Core.<*> (o Core..:? "longitude")
      )

instance Core.ToJSON Geolayerdata_Geo_Viewport_Hi where
  toJSON Geolayerdata_Geo_Viewport_Hi {..} =
    Core.object
      ( Core.catMaybes
          [ ("latitude" Core..=) Core.<$> latitude,
            ("longitude" Core..=) Core.<$> longitude
          ]
      )

--
-- /See:/ 'newGeolayerdata_Geo_Viewport_Lo' smart constructor.
data Geolayerdata_Geo_Viewport_Lo = Geolayerdata_Geo_Viewport_Lo
  { latitude :: (Core.Maybe Core.Double),
    longitude :: (Core.Maybe Core.Double)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Geolayerdata_Geo_Viewport_Lo' with the minimum fields required to make a request.
newGeolayerdata_Geo_Viewport_Lo ::
  Geolayerdata_Geo_Viewport_Lo
newGeolayerdata_Geo_Viewport_Lo =
  Geolayerdata_Geo_Viewport_Lo
    { latitude = Core.Nothing,
      longitude = Core.Nothing
    }

instance Core.FromJSON Geolayerdata_Geo_Viewport_Lo where
  parseJSON =
    Core.withObject
      "Geolayerdata_Geo_Viewport_Lo"
      ( \o ->
          Geolayerdata_Geo_Viewport_Lo
            Core.<$> (o Core..:? "latitude")
            Core.<*> (o Core..:? "longitude")
      )

instance Core.ToJSON Geolayerdata_Geo_Viewport_Lo where
  toJSON Geolayerdata_Geo_Viewport_Lo {..} =
    Core.object
      ( Core.catMaybes
          [ ("latitude" Core..=) Core.<$> latitude,
            ("longitude" Core..=) Core.<$> longitude
          ]
      )

--
-- /See:/ 'newLayersummaries' smart constructor.
data Layersummaries = Layersummaries
  { -- | A list of layer summary items.
    items :: (Core.Maybe [Layersummary]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | The total number of layer summaries found.
    totalItems :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Layersummaries' with the minimum fields required to make a request.
newLayersummaries ::
  Layersummaries
newLayersummaries =
  Layersummaries
    { items = Core.Nothing,
      kind = Core.Nothing,
      totalItems = Core.Nothing
    }

instance Core.FromJSON Layersummaries where
  parseJSON =
    Core.withObject
      "Layersummaries"
      ( \o ->
          Layersummaries
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "totalItems")
      )

instance Core.ToJSON Layersummaries where
  toJSON Layersummaries {..} =
    Core.object
      ( Core.catMaybes
          [ ("items" Core..=) Core.<$> items,
            ("kind" Core..=) Core.<$> kind,
            ("totalItems" Core..=) Core.<$> totalItems
          ]
      )

--
-- /See:/ 'newLayersummary' smart constructor.
data Layersummary = Layersummary
  { -- | The number of annotations for this layer.
    annotationCount :: (Core.Maybe Core.Int32),
    -- | The list of annotation types contained for this layer.
    annotationTypes :: (Core.Maybe [Core.Text]),
    -- | Link to get data for this annotation.
    annotationsDataLink :: (Core.Maybe Core.Text),
    -- | The link to get the annotations for this layer.
    annotationsLink :: (Core.Maybe Core.Text),
    -- | The content version this resource is for.
    contentVersion :: (Core.Maybe Core.Text),
    -- | The number of data items for this layer.
    dataCount :: (Core.Maybe Core.Int32),
    -- | Unique id of this layer summary.
    id :: (Core.Maybe Core.Text),
    -- | Resource Type
    kind :: (Core.Maybe Core.Text),
    -- | The layer id for this summary.
    layerId :: (Core.Maybe Core.Text),
    -- | URL to this resource.
    selfLink :: (Core.Maybe Core.Text),
    -- | Timestamp for the last time an item in this layer was updated. (RFC 3339 UTC date-time format).
    updated :: (Core.Maybe Core.Text),
    -- | The current version of this layer\'s volume annotations. Note that this version applies only to the data in the books.layers.volumeAnnotations.* responses. The actual annotation data is versioned separately.
    volumeAnnotationsVersion :: (Core.Maybe Core.Text),
    -- | The volume id this resource is for.
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Layersummary' with the minimum fields required to make a request.
newLayersummary ::
  Layersummary
newLayersummary =
  Layersummary
    { annotationCount = Core.Nothing,
      annotationTypes = Core.Nothing,
      annotationsDataLink = Core.Nothing,
      annotationsLink = Core.Nothing,
      contentVersion = Core.Nothing,
      dataCount = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      layerId = Core.Nothing,
      selfLink = Core.Nothing,
      updated = Core.Nothing,
      volumeAnnotationsVersion = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON Layersummary where
  parseJSON =
    Core.withObject
      "Layersummary"
      ( \o ->
          Layersummary
            Core.<$> (o Core..:? "annotationCount")
            Core.<*> (o Core..:? "annotationTypes")
            Core.<*> (o Core..:? "annotationsDataLink")
            Core.<*> (o Core..:? "annotationsLink")
            Core.<*> (o Core..:? "contentVersion")
            Core.<*> (o Core..:? "dataCount")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "layerId")
            Core.<*> (o Core..:? "selfLink")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "volumeAnnotationsVersion")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON Layersummary where
  toJSON Layersummary {..} =
    Core.object
      ( Core.catMaybes
          [ ("annotationCount" Core..=) Core.<$> annotationCount,
            ("annotationTypes" Core..=) Core.<$> annotationTypes,
            ("annotationsDataLink" Core..=) Core.<$> annotationsDataLink,
            ("annotationsLink" Core..=) Core.<$> annotationsLink,
            ("contentVersion" Core..=) Core.<$> contentVersion,
            ("dataCount" Core..=) Core.<$> dataCount,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("layerId" Core..=) Core.<$> layerId,
            ("selfLink" Core..=) Core.<$> selfLink,
            ("updated" Core..=) Core.<$> updated,
            ("volumeAnnotationsVersion" Core..=)
              Core.<$> volumeAnnotationsVersion,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newMetadata' smart constructor.
data Metadata = Metadata
  { -- | A list of offline dictionary metadata.
    items :: (Core.Maybe [Metadata_ItemsItem]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Metadata' with the minimum fields required to make a request.
newMetadata ::
  Metadata
newMetadata = Metadata {items = Core.Nothing, kind = Core.Nothing}

instance Core.FromJSON Metadata where
  parseJSON =
    Core.withObject
      "Metadata"
      ( \o ->
          Metadata
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON Metadata where
  toJSON Metadata {..} =
    Core.object
      ( Core.catMaybes
          [("items" Core..=) Core.<$> items, ("kind" Core..=) Core.<$> kind]
      )

--
-- /See:/ 'newMetadata_ItemsItem' smart constructor.
data Metadata_ItemsItem = Metadata_ItemsItem
  { downloadUrl :: (Core.Maybe Core.Text),
    encryptedKey :: (Core.Maybe Core.Text),
    language :: (Core.Maybe Core.Text),
    size :: (Core.Maybe Core.Int64),
    version :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Metadata_ItemsItem' with the minimum fields required to make a request.
newMetadata_ItemsItem ::
  Metadata_ItemsItem
newMetadata_ItemsItem =
  Metadata_ItemsItem
    { downloadUrl = Core.Nothing,
      encryptedKey = Core.Nothing,
      language = Core.Nothing,
      size = Core.Nothing,
      version = Core.Nothing
    }

instance Core.FromJSON Metadata_ItemsItem where
  parseJSON =
    Core.withObject
      "Metadata_ItemsItem"
      ( \o ->
          Metadata_ItemsItem
            Core.<$> (o Core..:? "download_url")
            Core.<*> (o Core..:? "encrypted_key")
            Core.<*> (o Core..:? "language")
            Core.<*> (o Core..:? "size" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "version" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON Metadata_ItemsItem where
  toJSON Metadata_ItemsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("download_url" Core..=) Core.<$> downloadUrl,
            ("encrypted_key" Core..=) Core.<$> encryptedKey,
            ("language" Core..=) Core.<$> language,
            ("size" Core..=) Core.. Core.AsText Core.<$> size,
            ("version" Core..=) Core.. Core.AsText Core.<$> version
          ]
      )

--
-- /See:/ 'newNotification' smart constructor.
data Notification = Notification
  { body :: (Core.Maybe Core.Text),
    -- | The list of crm experiment ids.
    crmExperimentIds :: (Core.Maybe [Core.Int64]),
    docId :: (Core.Maybe Core.Text),
    docType :: (Core.Maybe Core.Text),
    dontShowNotification :: (Core.Maybe Core.Bool),
    iconUrl :: (Core.Maybe Core.Text),
    isDocumentMature :: (Core.Maybe Core.Bool),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    notificationGroup :: (Core.Maybe Core.Text),
    notificationType :: (Core.Maybe Core.Text),
    pcampaignId :: (Core.Maybe Core.Text),
    reason :: (Core.Maybe Core.Text),
    showNotificationSettingsAction :: (Core.Maybe Core.Bool),
    targetUrl :: (Core.Maybe Core.Text),
    timeToExpireMs :: (Core.Maybe Core.Int64),
    title :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Notification' with the minimum fields required to make a request.
newNotification ::
  Notification
newNotification =
  Notification
    { body = Core.Nothing,
      crmExperimentIds = Core.Nothing,
      docId = Core.Nothing,
      docType = Core.Nothing,
      dontShowNotification = Core.Nothing,
      iconUrl = Core.Nothing,
      isDocumentMature = Core.Nothing,
      kind = Core.Nothing,
      notificationGroup = Core.Nothing,
      notificationType = Core.Nothing,
      pcampaignId = Core.Nothing,
      reason = Core.Nothing,
      showNotificationSettingsAction = Core.Nothing,
      targetUrl = Core.Nothing,
      timeToExpireMs = Core.Nothing,
      title = Core.Nothing
    }

instance Core.FromJSON Notification where
  parseJSON =
    Core.withObject
      "Notification"
      ( \o ->
          Notification
            Core.<$> (o Core..:? "body")
            Core.<*> ( o
                         Core..:? "crmExperimentIds"
                         Core.<&> Core.fmap (Core.fmap Core.fromAsText)
                     )
            Core.<*> (o Core..:? "doc_id")
            Core.<*> (o Core..:? "doc_type")
            Core.<*> (o Core..:? "dont_show_notification")
            Core.<*> (o Core..:? "iconUrl")
            Core.<*> (o Core..:? "is_document_mature")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "notificationGroup")
            Core.<*> (o Core..:? "notification_type")
            Core.<*> (o Core..:? "pcampaign_id")
            Core.<*> (o Core..:? "reason")
            Core.<*> (o Core..:? "show_notification_settings_action")
            Core.<*> (o Core..:? "targetUrl")
            Core.<*> (o Core..:? "timeToExpireMs" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "title")
      )

instance Core.ToJSON Notification where
  toJSON Notification {..} =
    Core.object
      ( Core.catMaybes
          [ ("body" Core..=) Core.<$> body,
            ("crmExperimentIds" Core..=)
              Core.. Core.fmap Core.AsText
              Core.<$> crmExperimentIds,
            ("doc_id" Core..=) Core.<$> docId,
            ("doc_type" Core..=) Core.<$> docType,
            ("dont_show_notification" Core..=) Core.<$> dontShowNotification,
            ("iconUrl" Core..=) Core.<$> iconUrl,
            ("is_document_mature" Core..=) Core.<$> isDocumentMature,
            ("kind" Core..=) Core.<$> kind,
            ("notificationGroup" Core..=) Core.<$> notificationGroup,
            ("notification_type" Core..=) Core.<$> notificationType,
            ("pcampaign_id" Core..=) Core.<$> pcampaignId,
            ("reason" Core..=) Core.<$> reason,
            ("show_notification_settings_action" Core..=)
              Core.<$> showNotificationSettingsAction,
            ("targetUrl" Core..=) Core.<$> targetUrl,
            ("timeToExpireMs" Core..=)
              Core.. Core.AsText
              Core.<$> timeToExpireMs,
            ("title" Core..=) Core.<$> title
          ]
      )

--
-- /See:/ 'newOffers' smart constructor.
data Offers = Offers
  { -- | A list of offers.
    items :: (Core.Maybe [Offers_ItemsItem]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Offers' with the minimum fields required to make a request.
newOffers ::
  Offers
newOffers = Offers {items = Core.Nothing, kind = Core.Nothing}

instance Core.FromJSON Offers where
  parseJSON =
    Core.withObject
      "Offers"
      ( \o ->
          Offers Core.<$> (o Core..:? "items") Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON Offers where
  toJSON Offers {..} =
    Core.object
      ( Core.catMaybes
          [("items" Core..=) Core.<$> items, ("kind" Core..=) Core.<$> kind]
      )

--
-- /See:/ 'newOffers_ItemsItem' smart constructor.
data Offers_ItemsItem = Offers_ItemsItem
  { artUrl :: (Core.Maybe Core.Text),
    gservicesKey :: (Core.Maybe Core.Text),
    id :: (Core.Maybe Core.Text),
    items :: (Core.Maybe [Offers_ItemsItem_ItemsItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Offers_ItemsItem' with the minimum fields required to make a request.
newOffers_ItemsItem ::
  Offers_ItemsItem
newOffers_ItemsItem =
  Offers_ItemsItem
    { artUrl = Core.Nothing,
      gservicesKey = Core.Nothing,
      id = Core.Nothing,
      items = Core.Nothing
    }

instance Core.FromJSON Offers_ItemsItem where
  parseJSON =
    Core.withObject
      "Offers_ItemsItem"
      ( \o ->
          Offers_ItemsItem
            Core.<$> (o Core..:? "artUrl")
            Core.<*> (o Core..:? "gservicesKey")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "items")
      )

instance Core.ToJSON Offers_ItemsItem where
  toJSON Offers_ItemsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("artUrl" Core..=) Core.<$> artUrl,
            ("gservicesKey" Core..=) Core.<$> gservicesKey,
            ("id" Core..=) Core.<$> id,
            ("items" Core..=) Core.<$> items
          ]
      )

--
-- /See:/ 'newOffers_ItemsItem_ItemsItem' smart constructor.
data Offers_ItemsItem_ItemsItem = Offers_ItemsItem_ItemsItem
  { author :: (Core.Maybe Core.Text),
    canonicalVolumeLink :: (Core.Maybe Core.Text),
    coverUrl :: (Core.Maybe Core.Text),
    description :: (Core.Maybe Core.Text),
    title :: (Core.Maybe Core.Text),
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Offers_ItemsItem_ItemsItem' with the minimum fields required to make a request.
newOffers_ItemsItem_ItemsItem ::
  Offers_ItemsItem_ItemsItem
newOffers_ItemsItem_ItemsItem =
  Offers_ItemsItem_ItemsItem
    { author = Core.Nothing,
      canonicalVolumeLink = Core.Nothing,
      coverUrl = Core.Nothing,
      description = Core.Nothing,
      title = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON Offers_ItemsItem_ItemsItem where
  parseJSON =
    Core.withObject
      "Offers_ItemsItem_ItemsItem"
      ( \o ->
          Offers_ItemsItem_ItemsItem
            Core.<$> (o Core..:? "author")
            Core.<*> (o Core..:? "canonicalVolumeLink")
            Core.<*> (o Core..:? "coverUrl")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "title")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON Offers_ItemsItem_ItemsItem where
  toJSON Offers_ItemsItem_ItemsItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("author" Core..=) Core.<$> author,
            ("canonicalVolumeLink" Core..=) Core.<$> canonicalVolumeLink,
            ("coverUrl" Core..=) Core.<$> coverUrl,
            ("description" Core..=) Core.<$> description,
            ("title" Core..=) Core.<$> title,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newReadingPosition' smart constructor.
data ReadingPosition = ReadingPosition
  { -- | Position in an EPUB as a CFI.
    epubCfiPosition :: (Core.Maybe Core.Text),
    -- | Position in a volume for image-based content.
    gbImagePosition :: (Core.Maybe Core.Text),
    -- | Position in a volume for text-based content.
    gbTextPosition :: (Core.Maybe Core.Text),
    -- | Resource type for a reading position.
    kind :: (Core.Maybe Core.Text),
    -- | Position in a PDF file.
    pdfPosition :: (Core.Maybe Core.Text),
    -- | Timestamp when this reading position was last updated (formatted UTC timestamp with millisecond resolution).
    updated :: (Core.Maybe Core.Text),
    -- | Volume id associated with this reading position.
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'ReadingPosition' with the minimum fields required to make a request.
newReadingPosition ::
  ReadingPosition
newReadingPosition =
  ReadingPosition
    { epubCfiPosition = Core.Nothing,
      gbImagePosition = Core.Nothing,
      gbTextPosition = Core.Nothing,
      kind = Core.Nothing,
      pdfPosition = Core.Nothing,
      updated = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON ReadingPosition where
  parseJSON =
    Core.withObject
      "ReadingPosition"
      ( \o ->
          ReadingPosition
            Core.<$> (o Core..:? "epubCfiPosition")
            Core.<*> (o Core..:? "gbImagePosition")
            Core.<*> (o Core..:? "gbTextPosition")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "pdfPosition")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON ReadingPosition where
  toJSON ReadingPosition {..} =
    Core.object
      ( Core.catMaybes
          [ ("epubCfiPosition" Core..=) Core.<$> epubCfiPosition,
            ("gbImagePosition" Core..=) Core.<$> gbImagePosition,
            ("gbTextPosition" Core..=) Core.<$> gbTextPosition,
            ("kind" Core..=) Core.<$> kind,
            ("pdfPosition" Core..=) Core.<$> pdfPosition,
            ("updated" Core..=) Core.<$> updated,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

--
-- /See:/ 'newRequestAccessData' smart constructor.
data RequestAccessData = RequestAccessData
  { -- | A concurrent access response.
    concurrentAccess :: (Core.Maybe ConcurrentAccessRestriction),
    -- | A download access response.
    downloadAccess :: (Core.Maybe DownloadAccessRestriction),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'RequestAccessData' with the minimum fields required to make a request.
newRequestAccessData ::
  RequestAccessData
newRequestAccessData =
  RequestAccessData
    { concurrentAccess = Core.Nothing,
      downloadAccess = Core.Nothing,
      kind = Core.Nothing
    }

instance Core.FromJSON RequestAccessData where
  parseJSON =
    Core.withObject
      "RequestAccessData"
      ( \o ->
          RequestAccessData
            Core.<$> (o Core..:? "concurrentAccess")
            Core.<*> (o Core..:? "downloadAccess")
            Core.<*> (o Core..:? "kind")
      )

instance Core.ToJSON RequestAccessData where
  toJSON RequestAccessData {..} =
    Core.object
      ( Core.catMaybes
          [ ("concurrentAccess" Core..=) Core.<$> concurrentAccess,
            ("downloadAccess" Core..=) Core.<$> downloadAccess,
            ("kind" Core..=) Core.<$> kind
          ]
      )

--
-- /See:/ 'newReview' smart constructor.
data Review = Review
  { -- | Author of this review.
    author :: (Core.Maybe Review_Author),
    -- | Review text.
    content :: (Core.Maybe Core.Text),
    -- | Date of this review.
    date :: (Core.Maybe Core.Text),
    -- | URL for the full review text, for reviews gathered from the web.
    fullTextUrl :: (Core.Maybe Core.Text),
    -- | Resource type for a review.
    kind :: (Core.Maybe Core.Text),
    -- | Star rating for this review. Possible values are ONE, TWO, THREE, FOUR, FIVE or NOT_RATED.
    rating :: (Core.Maybe Core.Text),
    -- | Information regarding the source of this review, when the review is not from a Google Books user.
    source :: (Core.Maybe Review_Source),
    -- | Title for this review.
    title :: (Core.Maybe Core.Text),
    -- | Source type for this review. Possible values are EDITORIAL, WEB/USER or GOOGLE/USER.
    type' :: (Core.Maybe Core.Text),
    -- | Volume that this review is for.
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Review' with the minimum fields required to make a request.
newReview ::
  Review
newReview =
  Review
    { author = Core.Nothing,
      content = Core.Nothing,
      date = Core.Nothing,
      fullTextUrl = Core.Nothing,
      kind = Core.Nothing,
      rating = Core.Nothing,
      source = Core.Nothing,
      title = Core.Nothing,
      type' = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON Review where
  parseJSON =
    Core.withObject
      "Review"
      ( \o ->
          Review
            Core.<$> (o Core..:? "author")
            Core.<*> (o Core..:? "content")
            Core.<*> (o Core..:? "date")
            Core.<*> (o Core..:? "fullTextUrl")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "rating")
            Core.<*> (o Core..:? "source")
            Core.<*> (o Core..:? "title")
            Core.<*> (o Core..:? "type")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON Review where
  toJSON Review {..} =
    Core.object
      ( Core.catMaybes
          [ ("author" Core..=) Core.<$> author,
            ("content" Core..=) Core.<$> content,
            ("date" Core..=) Core.<$> date,
            ("fullTextUrl" Core..=) Core.<$> fullTextUrl,
            ("kind" Core..=) Core.<$> kind,
            ("rating" Core..=) Core.<$> rating,
            ("source" Core..=) Core.<$> source,
            ("title" Core..=) Core.<$> title,
            ("type" Core..=) Core.<$> type',
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

-- | Author of this review.
--
-- /See:/ 'newReview_Author' smart constructor.
newtype Review_Author = Review_Author
  { -- | Name of this person.
    displayName :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Review_Author' with the minimum fields required to make a request.
newReview_Author ::
  Review_Author
newReview_Author = Review_Author {displayName = Core.Nothing}

instance Core.FromJSON Review_Author where
  parseJSON =
    Core.withObject
      "Review_Author"
      (\o -> Review_Author Core.<$> (o Core..:? "displayName"))

instance Core.ToJSON Review_Author where
  toJSON Review_Author {..} =
    Core.object
      (Core.catMaybes [("displayName" Core..=) Core.<$> displayName])

-- | Information regarding the source of this review, when the review is not from a Google Books user.
--
-- /See:/ 'newReview_Source' smart constructor.
data Review_Source = Review_Source
  { -- | Name of the source.
    description :: (Core.Maybe Core.Text),
    -- | Extra text about the source of the review.
    extraDescription :: (Core.Maybe Core.Text),
    -- | URL of the source of the review.
    url :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Review_Source' with the minimum fields required to make a request.
newReview_Source ::
  Review_Source
newReview_Source =
  Review_Source
    { description = Core.Nothing,
      extraDescription = Core.Nothing,
      url = Core.Nothing
    }

instance Core.FromJSON Review_Source where
  parseJSON =
    Core.withObject
      "Review_Source"
      ( \o ->
          Review_Source
            Core.<$> (o Core..:? "description")
            Core.<*> (o Core..:? "extraDescription")
            Core.<*> (o Core..:? "url")
      )

instance Core.ToJSON Review_Source where
  toJSON Review_Source {..} =
    Core.object
      ( Core.catMaybes
          [ ("description" Core..=) Core.<$> description,
            ("extraDescription" Core..=) Core.<$> extraDescription,
            ("url" Core..=) Core.<$> url
          ]
      )

--
-- /See:/ 'newSeries' smart constructor.
data Series = Series
  { -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    series :: (Core.Maybe [Series_SeriesItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Series' with the minimum fields required to make a request.
newSeries ::
  Series
newSeries = Series {kind = Core.Nothing, series = Core.Nothing}

instance Core.FromJSON Series where
  parseJSON =
    Core.withObject
      "Series"
      ( \o ->
          Series Core.<$> (o Core..:? "kind") Core.<*> (o Core..:? "series")
      )

instance Core.ToJSON Series where
  toJSON Series {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("series" Core..=) Core.<$> series
          ]
      )

--
-- /See:/ 'newSeries_SeriesItem' smart constructor.
data Series_SeriesItem = Series_SeriesItem
  { bannerImageUrl :: (Core.Maybe Core.Text),
    eligibleForSubscription :: (Core.Maybe Core.Bool),
    imageUrl :: (Core.Maybe Core.Text),
    isComplete :: (Core.Maybe Core.Bool),
    seriesFormatType :: (Core.Maybe Core.Text),
    seriesId :: (Core.Maybe Core.Text),
    seriesSubscriptionReleaseInfo :: (Core.Maybe Series_SeriesItem_SeriesSubscriptionReleaseInfo),
    seriesType :: (Core.Maybe Core.Text),
    subscriptionId :: (Core.Maybe Core.Text),
    title :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Series_SeriesItem' with the minimum fields required to make a request.
newSeries_SeriesItem ::
  Series_SeriesItem
newSeries_SeriesItem =
  Series_SeriesItem
    { bannerImageUrl = Core.Nothing,
      eligibleForSubscription = Core.Nothing,
      imageUrl = Core.Nothing,
      isComplete = Core.Nothing,
      seriesFormatType = Core.Nothing,
      seriesId = Core.Nothing,
      seriesSubscriptionReleaseInfo = Core.Nothing,
      seriesType = Core.Nothing,
      subscriptionId = Core.Nothing,
      title = Core.Nothing
    }

instance Core.FromJSON Series_SeriesItem where
  parseJSON =
    Core.withObject
      "Series_SeriesItem"
      ( \o ->
          Series_SeriesItem
            Core.<$> (o Core..:? "bannerImageUrl")
            Core.<*> (o Core..:? "eligibleForSubscription")
            Core.<*> (o Core..:? "imageUrl")
            Core.<*> (o Core..:? "isComplete")
            Core.<*> (o Core..:? "seriesFormatType")
            Core.<*> (o Core..:? "seriesId")
            Core.<*> (o Core..:? "seriesSubscriptionReleaseInfo")
            Core.<*> (o Core..:? "seriesType")
            Core.<*> (o Core..:? "subscriptionId")
            Core.<*> (o Core..:? "title")
      )

instance Core.ToJSON Series_SeriesItem where
  toJSON Series_SeriesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("bannerImageUrl" Core..=) Core.<$> bannerImageUrl,
            ("eligibleForSubscription" Core..=)
              Core.<$> eligibleForSubscription,
            ("imageUrl" Core..=) Core.<$> imageUrl,
            ("isComplete" Core..=) Core.<$> isComplete,
            ("seriesFormatType" Core..=) Core.<$> seriesFormatType,
            ("seriesId" Core..=) Core.<$> seriesId,
            ("seriesSubscriptionReleaseInfo" Core..=)
              Core.<$> seriesSubscriptionReleaseInfo,
            ("seriesType" Core..=) Core.<$> seriesType,
            ("subscriptionId" Core..=) Core.<$> subscriptionId,
            ("title" Core..=) Core.<$> title
          ]
      )

--
-- /See:/ 'newSeries_SeriesItem_SeriesSubscriptionReleaseInfo' smart constructor.
data Series_SeriesItem_SeriesSubscriptionReleaseInfo = Series_SeriesItem_SeriesSubscriptionReleaseInfo
  { cancelTime :: (Core.Maybe Core.Text),
    currentReleaseInfo ::
      ( Core.Maybe
          Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
      ),
    nextReleaseInfo ::
      ( Core.Maybe
          Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
      ),
    seriesSubscriptionType :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Series_SeriesItem_SeriesSubscriptionReleaseInfo' with the minimum fields required to make a request.
newSeries_SeriesItem_SeriesSubscriptionReleaseInfo ::
  Series_SeriesItem_SeriesSubscriptionReleaseInfo
newSeries_SeriesItem_SeriesSubscriptionReleaseInfo =
  Series_SeriesItem_SeriesSubscriptionReleaseInfo
    { cancelTime =
        Core.Nothing,
      currentReleaseInfo = Core.Nothing,
      nextReleaseInfo = Core.Nothing,
      seriesSubscriptionType = Core.Nothing
    }

instance
  Core.FromJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo
  where
  parseJSON =
    Core.withObject
      "Series_SeriesItem_SeriesSubscriptionReleaseInfo"
      ( \o ->
          Series_SeriesItem_SeriesSubscriptionReleaseInfo
            Core.<$> (o Core..:? "cancelTime")
            Core.<*> (o Core..:? "currentReleaseInfo")
            Core.<*> (o Core..:? "nextReleaseInfo")
            Core.<*> (o Core..:? "seriesSubscriptionType")
      )

instance
  Core.ToJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo
  where
  toJSON Series_SeriesItem_SeriesSubscriptionReleaseInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("cancelTime" Core..=) Core.<$> cancelTime,
            ("currentReleaseInfo" Core..=) Core.<$> currentReleaseInfo,
            ("nextReleaseInfo" Core..=) Core.<$> nextReleaseInfo,
            ("seriesSubscriptionType" Core..=)
              Core.<$> seriesSubscriptionType
          ]
      )

--
-- /See:/ 'newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo' smart constructor.
data Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo = Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
  { amountInMicros :: (Core.Maybe Core.Double),
    currencyCode :: (Core.Maybe Core.Text),
    releaseNumber :: (Core.Maybe Core.Text),
    releaseTime :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo' with the minimum fields required to make a request.
newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo ::
  Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo =
  Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
    { amountInMicros =
        Core.Nothing,
      currencyCode = Core.Nothing,
      releaseNumber = Core.Nothing,
      releaseTime = Core.Nothing
    }

instance
  Core.FromJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
  where
  parseJSON =
    Core.withObject
      "Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo"
      ( \o ->
          Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
            Core.<$> (o Core..:? "amountInMicros")
            Core.<*> (o Core..:? "currencyCode")
            Core.<*> (o Core..:? "releaseNumber")
            Core.<*> (o Core..:? "releaseTime")
      )

instance
  Core.ToJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo
  where
  toJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_CurrentReleaseInfo {..} =
      Core.object
        ( Core.catMaybes
            [ ("amountInMicros" Core..=) Core.<$> amountInMicros,
              ("currencyCode" Core..=) Core.<$> currencyCode,
              ("releaseNumber" Core..=) Core.<$> releaseNumber,
              ("releaseTime" Core..=) Core.<$> releaseTime
            ]
        )

--
-- /See:/ 'newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo' smart constructor.
data Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo = Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
  { amountInMicros :: (Core.Maybe Core.Double),
    currencyCode :: (Core.Maybe Core.Text),
    releaseNumber :: (Core.Maybe Core.Text),
    releaseTime :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo' with the minimum fields required to make a request.
newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo ::
  Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
newSeries_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo =
  Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
    { amountInMicros =
        Core.Nothing,
      currencyCode = Core.Nothing,
      releaseNumber = Core.Nothing,
      releaseTime = Core.Nothing
    }

instance
  Core.FromJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
  where
  parseJSON =
    Core.withObject
      "Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo"
      ( \o ->
          Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
            Core.<$> (o Core..:? "amountInMicros")
            Core.<*> (o Core..:? "currencyCode")
            Core.<*> (o Core..:? "releaseNumber")
            Core.<*> (o Core..:? "releaseTime")
      )

instance
  Core.ToJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo
  where
  toJSON
    Series_SeriesItem_SeriesSubscriptionReleaseInfo_NextReleaseInfo {..} =
      Core.object
        ( Core.catMaybes
            [ ("amountInMicros" Core..=) Core.<$> amountInMicros,
              ("currencyCode" Core..=) Core.<$> currencyCode,
              ("releaseNumber" Core..=) Core.<$> releaseNumber,
              ("releaseTime" Core..=) Core.<$> releaseTime
            ]
        )

--
-- /See:/ 'newSeriesmembership' smart constructor.
data Seriesmembership = Seriesmembership
  { -- | Resorce type.
    kind :: (Core.Maybe Core.Text),
    member :: (Core.Maybe [Volume]),
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Seriesmembership' with the minimum fields required to make a request.
newSeriesmembership ::
  Seriesmembership
newSeriesmembership =
  Seriesmembership
    { kind = Core.Nothing,
      member = Core.Nothing,
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON Seriesmembership where
  parseJSON =
    Core.withObject
      "Seriesmembership"
      ( \o ->
          Seriesmembership
            Core.<$> (o Core..:? "kind")
            Core.<*> (o Core..:? "member")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON Seriesmembership where
  toJSON Seriesmembership {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("member" Core..=) Core.<$> member,
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

--
-- /See:/ 'newUsersettings' smart constructor.
data Usersettings = Usersettings
  { -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | User settings in sub-objects, each for different purposes.
    notesExport :: (Core.Maybe Usersettings_NotesExport),
    notification :: (Core.Maybe Usersettings_Notification)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings' with the minimum fields required to make a request.
newUsersettings ::
  Usersettings
newUsersettings =
  Usersettings
    { kind = Core.Nothing,
      notesExport = Core.Nothing,
      notification = Core.Nothing
    }

instance Core.FromJSON Usersettings where
  parseJSON =
    Core.withObject
      "Usersettings"
      ( \o ->
          Usersettings
            Core.<$> (o Core..:? "kind")
            Core.<*> (o Core..:? "notesExport")
            Core.<*> (o Core..:? "notification")
      )

instance Core.ToJSON Usersettings where
  toJSON Usersettings {..} =
    Core.object
      ( Core.catMaybes
          [ ("kind" Core..=) Core.<$> kind,
            ("notesExport" Core..=) Core.<$> notesExport,
            ("notification" Core..=) Core.<$> notification
          ]
      )

-- | User settings in sub-objects, each for different purposes.
--
-- /See:/ 'newUsersettings_NotesExport' smart constructor.
data Usersettings_NotesExport = Usersettings_NotesExport
  { folderName :: (Core.Maybe Core.Text),
    isEnabled :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings_NotesExport' with the minimum fields required to make a request.
newUsersettings_NotesExport ::
  Usersettings_NotesExport
newUsersettings_NotesExport =
  Usersettings_NotesExport
    { folderName = Core.Nothing,
      isEnabled = Core.Nothing
    }

instance Core.FromJSON Usersettings_NotesExport where
  parseJSON =
    Core.withObject
      "Usersettings_NotesExport"
      ( \o ->
          Usersettings_NotesExport
            Core.<$> (o Core..:? "folderName")
            Core.<*> (o Core..:? "isEnabled")
      )

instance Core.ToJSON Usersettings_NotesExport where
  toJSON Usersettings_NotesExport {..} =
    Core.object
      ( Core.catMaybes
          [ ("folderName" Core..=) Core.<$> folderName,
            ("isEnabled" Core..=) Core.<$> isEnabled
          ]
      )

--
-- /See:/ 'newUsersettings_Notification' smart constructor.
data Usersettings_Notification = Usersettings_Notification
  { matchMyInterests :: (Core.Maybe Usersettings_Notification_MatchMyInterests),
    moreFromAuthors :: (Core.Maybe Usersettings_Notification_MoreFromAuthors),
    moreFromSeries :: (Core.Maybe Usersettings_Notification_MoreFromSeries),
    priceDrop :: (Core.Maybe Usersettings_Notification_PriceDrop),
    rewardExpirations :: (Core.Maybe Usersettings_Notification_RewardExpirations)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings_Notification' with the minimum fields required to make a request.
newUsersettings_Notification ::
  Usersettings_Notification
newUsersettings_Notification =
  Usersettings_Notification
    { matchMyInterests = Core.Nothing,
      moreFromAuthors = Core.Nothing,
      moreFromSeries = Core.Nothing,
      priceDrop = Core.Nothing,
      rewardExpirations = Core.Nothing
    }

instance Core.FromJSON Usersettings_Notification where
  parseJSON =
    Core.withObject
      "Usersettings_Notification"
      ( \o ->
          Usersettings_Notification
            Core.<$> (o Core..:? "matchMyInterests")
            Core.<*> (o Core..:? "moreFromAuthors")
            Core.<*> (o Core..:? "moreFromSeries")
            Core.<*> (o Core..:? "priceDrop")
            Core.<*> (o Core..:? "rewardExpirations")
      )

instance Core.ToJSON Usersettings_Notification where
  toJSON Usersettings_Notification {..} =
    Core.object
      ( Core.catMaybes
          [ ("matchMyInterests" Core..=) Core.<$> matchMyInterests,
            ("moreFromAuthors" Core..=) Core.<$> moreFromAuthors,
            ("moreFromSeries" Core..=) Core.<$> moreFromSeries,
            ("priceDrop" Core..=) Core.<$> priceDrop,
            ("rewardExpirations" Core..=) Core.<$> rewardExpirations
          ]
      )

--
-- /See:/ 'newUsersettings_Notification_MatchMyInterests' smart constructor.
newtype Usersettings_Notification_MatchMyInterests = Usersettings_Notification_MatchMyInterests
  { optedState :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings_Notification_MatchMyInterests' with the minimum fields required to make a request.
newUsersettings_Notification_MatchMyInterests ::
  Usersettings_Notification_MatchMyInterests
newUsersettings_Notification_MatchMyInterests =
  Usersettings_Notification_MatchMyInterests
    { optedState =
        Core.Nothing
    }

instance Core.FromJSON Usersettings_Notification_MatchMyInterests where
  parseJSON =
    Core.withObject
      "Usersettings_Notification_MatchMyInterests"
      ( \o ->
          Usersettings_Notification_MatchMyInterests
            Core.<$> (o Core..:? "opted_state")
      )

instance Core.ToJSON Usersettings_Notification_MatchMyInterests where
  toJSON Usersettings_Notification_MatchMyInterests {..} =
    Core.object
      (Core.catMaybes [("opted_state" Core..=) Core.<$> optedState])

--
-- /See:/ 'newUsersettings_Notification_MoreFromAuthors' smart constructor.
newtype Usersettings_Notification_MoreFromAuthors = Usersettings_Notification_MoreFromAuthors
  { optedState :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings_Notification_MoreFromAuthors' with the minimum fields required to make a request.
newUsersettings_Notification_MoreFromAuthors ::
  Usersettings_Notification_MoreFromAuthors
newUsersettings_Notification_MoreFromAuthors =
  Usersettings_Notification_MoreFromAuthors
    { optedState =
        Core.Nothing
    }

instance Core.FromJSON Usersettings_Notification_MoreFromAuthors where
  parseJSON =
    Core.withObject
      "Usersettings_Notification_MoreFromAuthors"
      ( \o ->
          Usersettings_Notification_MoreFromAuthors
            Core.<$> (o Core..:? "opted_state")
      )

instance Core.ToJSON Usersettings_Notification_MoreFromAuthors where
  toJSON Usersettings_Notification_MoreFromAuthors {..} =
    Core.object
      (Core.catMaybes [("opted_state" Core..=) Core.<$> optedState])

--
-- /See:/ 'newUsersettings_Notification_MoreFromSeries' smart constructor.
newtype Usersettings_Notification_MoreFromSeries = Usersettings_Notification_MoreFromSeries
  { optedState :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings_Notification_MoreFromSeries' with the minimum fields required to make a request.
newUsersettings_Notification_MoreFromSeries ::
  Usersettings_Notification_MoreFromSeries
newUsersettings_Notification_MoreFromSeries =
  Usersettings_Notification_MoreFromSeries
    { optedState =
        Core.Nothing
    }

instance Core.FromJSON Usersettings_Notification_MoreFromSeries where
  parseJSON =
    Core.withObject
      "Usersettings_Notification_MoreFromSeries"
      ( \o ->
          Usersettings_Notification_MoreFromSeries
            Core.<$> (o Core..:? "opted_state")
      )

instance Core.ToJSON Usersettings_Notification_MoreFromSeries where
  toJSON Usersettings_Notification_MoreFromSeries {..} =
    Core.object
      (Core.catMaybes [("opted_state" Core..=) Core.<$> optedState])

--
-- /See:/ 'newUsersettings_Notification_PriceDrop' smart constructor.
newtype Usersettings_Notification_PriceDrop = Usersettings_Notification_PriceDrop
  { optedState :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings_Notification_PriceDrop' with the minimum fields required to make a request.
newUsersettings_Notification_PriceDrop ::
  Usersettings_Notification_PriceDrop
newUsersettings_Notification_PriceDrop =
  Usersettings_Notification_PriceDrop {optedState = Core.Nothing}

instance Core.FromJSON Usersettings_Notification_PriceDrop where
  parseJSON =
    Core.withObject
      "Usersettings_Notification_PriceDrop"
      ( \o ->
          Usersettings_Notification_PriceDrop
            Core.<$> (o Core..:? "opted_state")
      )

instance Core.ToJSON Usersettings_Notification_PriceDrop where
  toJSON Usersettings_Notification_PriceDrop {..} =
    Core.object
      (Core.catMaybes [("opted_state" Core..=) Core.<$> optedState])

--
-- /See:/ 'newUsersettings_Notification_RewardExpirations' smart constructor.
newtype Usersettings_Notification_RewardExpirations = Usersettings_Notification_RewardExpirations
  { optedState :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Usersettings_Notification_RewardExpirations' with the minimum fields required to make a request.
newUsersettings_Notification_RewardExpirations ::
  Usersettings_Notification_RewardExpirations
newUsersettings_Notification_RewardExpirations =
  Usersettings_Notification_RewardExpirations
    { optedState =
        Core.Nothing
    }

instance Core.FromJSON Usersettings_Notification_RewardExpirations where
  parseJSON =
    Core.withObject
      "Usersettings_Notification_RewardExpirations"
      ( \o ->
          Usersettings_Notification_RewardExpirations
            Core.<$> (o Core..:? "opted_state")
      )

instance Core.ToJSON Usersettings_Notification_RewardExpirations where
  toJSON Usersettings_Notification_RewardExpirations {..} =
    Core.object
      (Core.catMaybes [("opted_state" Core..=) Core.<$> optedState])

--
-- /See:/ 'newVolume' smart constructor.
data Volume = Volume
  { -- | Any information about a volume related to reading or obtaining that volume text. This information can depend on country (books may be public domain in one country but not in another, e.g.).
    accessInfo :: (Core.Maybe Volume_AccessInfo),
    -- | Opaque identifier for a specific version of a volume resource. (In LITE projection)
    etag :: (Core.Maybe Core.Text),
    -- | Unique identifier for a volume. (In LITE projection.)
    id :: (Core.Maybe Core.Text),
    -- | Resource type for a volume. (In LITE projection.)
    kind :: (Core.Maybe Core.Text),
    -- | What layers exist in this volume and high level information about them.
    layerInfo :: (Core.Maybe Volume_LayerInfo),
    -- | Recommendation related information for this volume.
    recommendedInfo :: (Core.Maybe Volume_RecommendedInfo),
    -- | Any information about a volume related to the eBookstore and\/or purchaseability. This information can depend on the country where the request originates from (i.e. books may not be for sale in certain countries).
    saleInfo :: (Core.Maybe Volume_SaleInfo),
    -- | Search result information related to this volume.
    searchInfo :: (Core.Maybe Volume_SearchInfo),
    -- | URL to this resource. (In LITE projection.)
    selfLink :: (Core.Maybe Core.Text),
    -- | User specific information related to this volume. (e.g. page this user last read or whether they purchased this book)
    userInfo :: (Core.Maybe Volume_UserInfo),
    -- | General volume information.
    volumeInfo :: (Core.Maybe Volume_VolumeInfo)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume' with the minimum fields required to make a request.
newVolume ::
  Volume
newVolume =
  Volume
    { accessInfo = Core.Nothing,
      etag = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      layerInfo = Core.Nothing,
      recommendedInfo = Core.Nothing,
      saleInfo = Core.Nothing,
      searchInfo = Core.Nothing,
      selfLink = Core.Nothing,
      userInfo = Core.Nothing,
      volumeInfo = Core.Nothing
    }

instance Core.FromJSON Volume where
  parseJSON =
    Core.withObject
      "Volume"
      ( \o ->
          Volume
            Core.<$> (o Core..:? "accessInfo")
            Core.<*> (o Core..:? "etag")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "layerInfo")
            Core.<*> (o Core..:? "recommendedInfo")
            Core.<*> (o Core..:? "saleInfo")
            Core.<*> (o Core..:? "searchInfo")
            Core.<*> (o Core..:? "selfLink")
            Core.<*> (o Core..:? "userInfo")
            Core.<*> (o Core..:? "volumeInfo")
      )

instance Core.ToJSON Volume where
  toJSON Volume {..} =
    Core.object
      ( Core.catMaybes
          [ ("accessInfo" Core..=) Core.<$> accessInfo,
            ("etag" Core..=) Core.<$> etag,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("layerInfo" Core..=) Core.<$> layerInfo,
            ("recommendedInfo" Core..=) Core.<$> recommendedInfo,
            ("saleInfo" Core..=) Core.<$> saleInfo,
            ("searchInfo" Core..=) Core.<$> searchInfo,
            ("selfLink" Core..=) Core.<$> selfLink,
            ("userInfo" Core..=) Core.<$> userInfo,
            ("volumeInfo" Core..=) Core.<$> volumeInfo
          ]
      )

-- | Any information about a volume related to reading or obtaining that volume text. This information can depend on country (books may be public domain in one country but not in another, e.g.).
--
-- /See:/ 'newVolume_AccessInfo' smart constructor.
data Volume_AccessInfo = Volume_AccessInfo
  { -- | Combines the access and viewability of this volume into a single status field for this user. Values can be FULL/PURCHASED, FULL/PUBLIC_DOMAIN, SAMPLE or NONE. (In LITE projection.)
    accessViewStatus :: (Core.Maybe Core.Text),
    -- | The two-letter ISO_3166-1 country code for which this access information is valid. (In LITE projection.)
    country :: (Core.Maybe Core.Text),
    -- | Information about a volume\'s download license access restrictions.
    downloadAccess :: (Core.Maybe DownloadAccessRestriction),
    -- | URL to the Google Drive viewer if this volume is uploaded by the user by selecting the file from Google Drive.
    driveImportedContentLink :: (Core.Maybe Core.Text),
    -- | Whether this volume can be embedded in a viewport using the Embedded Viewer API.
    embeddable :: (Core.Maybe Core.Bool),
    -- | Information about epub content. (In LITE projection.)
    epub :: (Core.Maybe Volume_AccessInfo_Epub),
    -- | Whether this volume requires that the client explicitly request offline download license rather than have it done automatically when loading the content, if the client supports it.
    explicitOfflineLicenseManagement :: (Core.Maybe Core.Bool),
    -- | Information about pdf content. (In LITE projection.)
    pdf :: (Core.Maybe Volume_AccessInfo_Pdf),
    -- | Whether or not this book is public domain in the country listed above.
    publicDomain :: (Core.Maybe Core.Bool),
    -- | Whether quote sharing is allowed for this volume.
    quoteSharingAllowed :: (Core.Maybe Core.Bool),
    -- | Whether text-to-speech is permitted for this volume. Values can be ALLOWED, ALLOWED/FOR/ACCESSIBILITY, or NOT_ALLOWED.
    textToSpeechPermission :: (Core.Maybe Core.Text),
    -- | For ordered but not yet processed orders, we give a URL that can be used to go to the appropriate Google Wallet page.
    viewOrderUrl :: (Core.Maybe Core.Text),
    -- | The read access of a volume. Possible values are PARTIAL, ALL/PAGES, NO/PAGES or UNKNOWN. This value depends on the country listed above. A value of PARTIAL means that the publisher has allowed some portion of the volume to be viewed publicly, without purchase. This can apply to eBooks as well as non-eBooks. Public domain books will always have a value of ALL_PAGES.
    viewability :: (Core.Maybe Core.Text),
    -- | URL to read this volume on the Google Books site. Link will not allow users to read non-viewable volumes.
    webReaderLink :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_AccessInfo' with the minimum fields required to make a request.
newVolume_AccessInfo ::
  Volume_AccessInfo
newVolume_AccessInfo =
  Volume_AccessInfo
    { accessViewStatus = Core.Nothing,
      country = Core.Nothing,
      downloadAccess = Core.Nothing,
      driveImportedContentLink = Core.Nothing,
      embeddable = Core.Nothing,
      epub = Core.Nothing,
      explicitOfflineLicenseManagement = Core.Nothing,
      pdf = Core.Nothing,
      publicDomain = Core.Nothing,
      quoteSharingAllowed = Core.Nothing,
      textToSpeechPermission = Core.Nothing,
      viewOrderUrl = Core.Nothing,
      viewability = Core.Nothing,
      webReaderLink = Core.Nothing
    }

instance Core.FromJSON Volume_AccessInfo where
  parseJSON =
    Core.withObject
      "Volume_AccessInfo"
      ( \o ->
          Volume_AccessInfo
            Core.<$> (o Core..:? "accessViewStatus")
            Core.<*> (o Core..:? "country")
            Core.<*> (o Core..:? "downloadAccess")
            Core.<*> (o Core..:? "driveImportedContentLink")
            Core.<*> (o Core..:? "embeddable")
            Core.<*> (o Core..:? "epub")
            Core.<*> (o Core..:? "explicitOfflineLicenseManagement")
            Core.<*> (o Core..:? "pdf")
            Core.<*> (o Core..:? "publicDomain")
            Core.<*> (o Core..:? "quoteSharingAllowed")
            Core.<*> (o Core..:? "textToSpeechPermission")
            Core.<*> (o Core..:? "viewOrderUrl")
            Core.<*> (o Core..:? "viewability")
            Core.<*> (o Core..:? "webReaderLink")
      )

instance Core.ToJSON Volume_AccessInfo where
  toJSON Volume_AccessInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("accessViewStatus" Core..=) Core.<$> accessViewStatus,
            ("country" Core..=) Core.<$> country,
            ("downloadAccess" Core..=) Core.<$> downloadAccess,
            ("driveImportedContentLink" Core..=)
              Core.<$> driveImportedContentLink,
            ("embeddable" Core..=) Core.<$> embeddable,
            ("epub" Core..=) Core.<$> epub,
            ("explicitOfflineLicenseManagement" Core..=)
              Core.<$> explicitOfflineLicenseManagement,
            ("pdf" Core..=) Core.<$> pdf,
            ("publicDomain" Core..=) Core.<$> publicDomain,
            ("quoteSharingAllowed" Core..=) Core.<$> quoteSharingAllowed,
            ("textToSpeechPermission" Core..=) Core.<$> textToSpeechPermission,
            ("viewOrderUrl" Core..=) Core.<$> viewOrderUrl,
            ("viewability" Core..=) Core.<$> viewability,
            ("webReaderLink" Core..=) Core.<$> webReaderLink
          ]
      )

-- | Information about epub content. (In LITE projection.)
--
-- /See:/ 'newVolume_AccessInfo_Epub' smart constructor.
data Volume_AccessInfo_Epub = Volume_AccessInfo_Epub
  { -- | URL to retrieve ACS token for epub download. (In LITE projection.)
    acsTokenLink :: (Core.Maybe Core.Text),
    -- | URL to download epub. (In LITE projection.)
    downloadLink :: (Core.Maybe Core.Text),
    -- | Is a flowing text epub available either as public domain or for purchase. (In LITE projection.)
    isAvailable :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_AccessInfo_Epub' with the minimum fields required to make a request.
newVolume_AccessInfo_Epub ::
  Volume_AccessInfo_Epub
newVolume_AccessInfo_Epub =
  Volume_AccessInfo_Epub
    { acsTokenLink = Core.Nothing,
      downloadLink = Core.Nothing,
      isAvailable = Core.Nothing
    }

instance Core.FromJSON Volume_AccessInfo_Epub where
  parseJSON =
    Core.withObject
      "Volume_AccessInfo_Epub"
      ( \o ->
          Volume_AccessInfo_Epub
            Core.<$> (o Core..:? "acsTokenLink")
            Core.<*> (o Core..:? "downloadLink")
            Core.<*> (o Core..:? "isAvailable")
      )

instance Core.ToJSON Volume_AccessInfo_Epub where
  toJSON Volume_AccessInfo_Epub {..} =
    Core.object
      ( Core.catMaybes
          [ ("acsTokenLink" Core..=) Core.<$> acsTokenLink,
            ("downloadLink" Core..=) Core.<$> downloadLink,
            ("isAvailable" Core..=) Core.<$> isAvailable
          ]
      )

-- | Information about pdf content. (In LITE projection.)
--
-- /See:/ 'newVolume_AccessInfo_Pdf' smart constructor.
data Volume_AccessInfo_Pdf = Volume_AccessInfo_Pdf
  { -- | URL to retrieve ACS token for pdf download. (In LITE projection.)
    acsTokenLink :: (Core.Maybe Core.Text),
    -- | URL to download pdf. (In LITE projection.)
    downloadLink :: (Core.Maybe Core.Text),
    -- | Is a scanned image pdf available either as public domain or for purchase. (In LITE projection.)
    isAvailable :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_AccessInfo_Pdf' with the minimum fields required to make a request.
newVolume_AccessInfo_Pdf ::
  Volume_AccessInfo_Pdf
newVolume_AccessInfo_Pdf =
  Volume_AccessInfo_Pdf
    { acsTokenLink = Core.Nothing,
      downloadLink = Core.Nothing,
      isAvailable = Core.Nothing
    }

instance Core.FromJSON Volume_AccessInfo_Pdf where
  parseJSON =
    Core.withObject
      "Volume_AccessInfo_Pdf"
      ( \o ->
          Volume_AccessInfo_Pdf
            Core.<$> (o Core..:? "acsTokenLink")
            Core.<*> (o Core..:? "downloadLink")
            Core.<*> (o Core..:? "isAvailable")
      )

instance Core.ToJSON Volume_AccessInfo_Pdf where
  toJSON Volume_AccessInfo_Pdf {..} =
    Core.object
      ( Core.catMaybes
          [ ("acsTokenLink" Core..=) Core.<$> acsTokenLink,
            ("downloadLink" Core..=) Core.<$> downloadLink,
            ("isAvailable" Core..=) Core.<$> isAvailable
          ]
      )

-- | What layers exist in this volume and high level information about them.
--
-- /See:/ 'newVolume_LayerInfo' smart constructor.
newtype Volume_LayerInfo = Volume_LayerInfo
  { -- | A layer should appear here if and only if the layer exists for this book.
    layers :: (Core.Maybe [Volume_LayerInfo_LayersItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_LayerInfo' with the minimum fields required to make a request.
newVolume_LayerInfo ::
  Volume_LayerInfo
newVolume_LayerInfo = Volume_LayerInfo {layers = Core.Nothing}

instance Core.FromJSON Volume_LayerInfo where
  parseJSON =
    Core.withObject
      "Volume_LayerInfo"
      (\o -> Volume_LayerInfo Core.<$> (o Core..:? "layers"))

instance Core.ToJSON Volume_LayerInfo where
  toJSON Volume_LayerInfo {..} =
    Core.object (Core.catMaybes [("layers" Core..=) Core.<$> layers])

--
-- /See:/ 'newVolume_LayerInfo_LayersItem' smart constructor.
data Volume_LayerInfo_LayersItem = Volume_LayerInfo_LayersItem
  { -- | The layer id of this layer (e.g. \"geo\").
    layerId :: (Core.Maybe Core.Text),
    -- | The current version of this layer\'s volume annotations. Note that this version applies only to the data in the books.layers.volumeAnnotations.* responses. The actual annotation data is versioned separately.
    volumeAnnotationsVersion :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_LayerInfo_LayersItem' with the minimum fields required to make a request.
newVolume_LayerInfo_LayersItem ::
  Volume_LayerInfo_LayersItem
newVolume_LayerInfo_LayersItem =
  Volume_LayerInfo_LayersItem
    { layerId = Core.Nothing,
      volumeAnnotationsVersion = Core.Nothing
    }

instance Core.FromJSON Volume_LayerInfo_LayersItem where
  parseJSON =
    Core.withObject
      "Volume_LayerInfo_LayersItem"
      ( \o ->
          Volume_LayerInfo_LayersItem
            Core.<$> (o Core..:? "layerId")
            Core.<*> (o Core..:? "volumeAnnotationsVersion")
      )

instance Core.ToJSON Volume_LayerInfo_LayersItem where
  toJSON Volume_LayerInfo_LayersItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("layerId" Core..=) Core.<$> layerId,
            ("volumeAnnotationsVersion" Core..=)
              Core.<$> volumeAnnotationsVersion
          ]
      )

-- | Recommendation related information for this volume.
--
-- /See:/ 'newVolume_RecommendedInfo' smart constructor.
newtype Volume_RecommendedInfo = Volume_RecommendedInfo
  { -- | A text explaining why this volume is recommended.
    explanation :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_RecommendedInfo' with the minimum fields required to make a request.
newVolume_RecommendedInfo ::
  Volume_RecommendedInfo
newVolume_RecommendedInfo =
  Volume_RecommendedInfo {explanation = Core.Nothing}

instance Core.FromJSON Volume_RecommendedInfo where
  parseJSON =
    Core.withObject
      "Volume_RecommendedInfo"
      (\o -> Volume_RecommendedInfo Core.<$> (o Core..:? "explanation"))

instance Core.ToJSON Volume_RecommendedInfo where
  toJSON Volume_RecommendedInfo {..} =
    Core.object
      (Core.catMaybes [("explanation" Core..=) Core.<$> explanation])

-- | Any information about a volume related to the eBookstore and\/or purchaseability. This information can depend on the country where the request originates from (i.e. books may not be for sale in certain countries).
--
-- /See:/ 'newVolume_SaleInfo' smart constructor.
data Volume_SaleInfo = Volume_SaleInfo
  { -- | URL to purchase this volume on the Google Books site. (In LITE projection)
    buyLink :: (Core.Maybe Core.Text),
    -- | The two-letter ISO_3166-1 country code for which this sale information is valid. (In LITE projection.)
    country :: (Core.Maybe Core.Text),
    -- | Whether or not this volume is an eBook (can be added to the My eBooks shelf).
    isEbook :: (Core.Maybe Core.Bool),
    -- | Suggested retail price. (In LITE projection.)
    listPrice :: (Core.Maybe Volume_SaleInfo_ListPrice),
    -- | Offers available for this volume (sales and rentals).
    offers :: (Core.Maybe [Volume_SaleInfo_OffersItem]),
    -- | The date on which this book is available for sale.
    onSaleDate :: (Core.Maybe Core.Text),
    -- | The actual selling price of the book. This is the same as the suggested retail or list price unless there are offers or discounts on this volume. (In LITE projection.)
    retailPrice :: (Core.Maybe Volume_SaleInfo_RetailPrice),
    -- | Whether or not this book is available for sale or offered for free in the Google eBookstore for the country listed above. Possible values are FOR/SALE, FOR/RENTAL/ONLY, FOR/SALE/AND/RENTAL, FREE, NOT/FOR/SALE, or FOR_PREORDER.
    saleability :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SaleInfo' with the minimum fields required to make a request.
newVolume_SaleInfo ::
  Volume_SaleInfo
newVolume_SaleInfo =
  Volume_SaleInfo
    { buyLink = Core.Nothing,
      country = Core.Nothing,
      isEbook = Core.Nothing,
      listPrice = Core.Nothing,
      offers = Core.Nothing,
      onSaleDate = Core.Nothing,
      retailPrice = Core.Nothing,
      saleability = Core.Nothing
    }

instance Core.FromJSON Volume_SaleInfo where
  parseJSON =
    Core.withObject
      "Volume_SaleInfo"
      ( \o ->
          Volume_SaleInfo
            Core.<$> (o Core..:? "buyLink")
            Core.<*> (o Core..:? "country")
            Core.<*> (o Core..:? "isEbook")
            Core.<*> (o Core..:? "listPrice")
            Core.<*> (o Core..:? "offers")
            Core.<*> (o Core..:? "onSaleDate")
            Core.<*> (o Core..:? "retailPrice")
            Core.<*> (o Core..:? "saleability")
      )

instance Core.ToJSON Volume_SaleInfo where
  toJSON Volume_SaleInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("buyLink" Core..=) Core.<$> buyLink,
            ("country" Core..=) Core.<$> country,
            ("isEbook" Core..=) Core.<$> isEbook,
            ("listPrice" Core..=) Core.<$> listPrice,
            ("offers" Core..=) Core.<$> offers,
            ("onSaleDate" Core..=) Core.<$> onSaleDate,
            ("retailPrice" Core..=) Core.<$> retailPrice,
            ("saleability" Core..=) Core.<$> saleability
          ]
      )

-- | Suggested retail price. (In LITE projection.)
--
-- /See:/ 'newVolume_SaleInfo_ListPrice' smart constructor.
data Volume_SaleInfo_ListPrice = Volume_SaleInfo_ListPrice
  { -- | Amount in the currency listed below. (In LITE projection.)
    amount :: (Core.Maybe Core.Double),
    -- | An ISO 4217, three-letter currency code. (In LITE projection.)
    currencyCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SaleInfo_ListPrice' with the minimum fields required to make a request.
newVolume_SaleInfo_ListPrice ::
  Volume_SaleInfo_ListPrice
newVolume_SaleInfo_ListPrice =
  Volume_SaleInfo_ListPrice
    { amount = Core.Nothing,
      currencyCode = Core.Nothing
    }

instance Core.FromJSON Volume_SaleInfo_ListPrice where
  parseJSON =
    Core.withObject
      "Volume_SaleInfo_ListPrice"
      ( \o ->
          Volume_SaleInfo_ListPrice
            Core.<$> (o Core..:? "amount")
            Core.<*> (o Core..:? "currencyCode")
      )

instance Core.ToJSON Volume_SaleInfo_ListPrice where
  toJSON Volume_SaleInfo_ListPrice {..} =
    Core.object
      ( Core.catMaybes
          [ ("amount" Core..=) Core.<$> amount,
            ("currencyCode" Core..=) Core.<$> currencyCode
          ]
      )

--
-- /See:/ 'newVolume_SaleInfo_OffersItem' smart constructor.
data Volume_SaleInfo_OffersItem = Volume_SaleInfo_OffersItem
  { -- | The finsky offer type (e.g., PURCHASE=0 RENTAL=3)
    finskyOfferType :: (Core.Maybe Core.Int32),
    -- | Indicates whether the offer is giftable.
    giftable :: (Core.Maybe Core.Bool),
    -- | Offer list (=undiscounted) price in Micros.
    listPrice :: (Core.Maybe Volume_SaleInfo_OffersItem_ListPrice),
    -- | The rental duration (for rental offers only).
    rentalDuration :: (Core.Maybe Volume_SaleInfo_OffersItem_RentalDuration),
    -- | Offer retail (=discounted) price in Micros
    retailPrice :: (Core.Maybe Volume_SaleInfo_OffersItem_RetailPrice)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SaleInfo_OffersItem' with the minimum fields required to make a request.
newVolume_SaleInfo_OffersItem ::
  Volume_SaleInfo_OffersItem
newVolume_SaleInfo_OffersItem =
  Volume_SaleInfo_OffersItem
    { finskyOfferType = Core.Nothing,
      giftable = Core.Nothing,
      listPrice = Core.Nothing,
      rentalDuration = Core.Nothing,
      retailPrice = Core.Nothing
    }

instance Core.FromJSON Volume_SaleInfo_OffersItem where
  parseJSON =
    Core.withObject
      "Volume_SaleInfo_OffersItem"
      ( \o ->
          Volume_SaleInfo_OffersItem
            Core.<$> (o Core..:? "finskyOfferType")
            Core.<*> (o Core..:? "giftable")
            Core.<*> (o Core..:? "listPrice")
            Core.<*> (o Core..:? "rentalDuration")
            Core.<*> (o Core..:? "retailPrice")
      )

instance Core.ToJSON Volume_SaleInfo_OffersItem where
  toJSON Volume_SaleInfo_OffersItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("finskyOfferType" Core..=) Core.<$> finskyOfferType,
            ("giftable" Core..=) Core.<$> giftable,
            ("listPrice" Core..=) Core.<$> listPrice,
            ("rentalDuration" Core..=) Core.<$> rentalDuration,
            ("retailPrice" Core..=) Core.<$> retailPrice
          ]
      )

-- | Offer list (=undiscounted) price in Micros.
--
-- /See:/ 'newVolume_SaleInfo_OffersItem_ListPrice' smart constructor.
data Volume_SaleInfo_OffersItem_ListPrice = Volume_SaleInfo_OffersItem_ListPrice
  { amountInMicros :: (Core.Maybe Core.Double),
    currencyCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SaleInfo_OffersItem_ListPrice' with the minimum fields required to make a request.
newVolume_SaleInfo_OffersItem_ListPrice ::
  Volume_SaleInfo_OffersItem_ListPrice
newVolume_SaleInfo_OffersItem_ListPrice =
  Volume_SaleInfo_OffersItem_ListPrice
    { amountInMicros =
        Core.Nothing,
      currencyCode = Core.Nothing
    }

instance Core.FromJSON Volume_SaleInfo_OffersItem_ListPrice where
  parseJSON =
    Core.withObject
      "Volume_SaleInfo_OffersItem_ListPrice"
      ( \o ->
          Volume_SaleInfo_OffersItem_ListPrice
            Core.<$> (o Core..:? "amountInMicros")
            Core.<*> (o Core..:? "currencyCode")
      )

instance Core.ToJSON Volume_SaleInfo_OffersItem_ListPrice where
  toJSON Volume_SaleInfo_OffersItem_ListPrice {..} =
    Core.object
      ( Core.catMaybes
          [ ("amountInMicros" Core..=) Core.<$> amountInMicros,
            ("currencyCode" Core..=) Core.<$> currencyCode
          ]
      )

-- | The rental duration (for rental offers only).
--
-- /See:/ 'newVolume_SaleInfo_OffersItem_RentalDuration' smart constructor.
data Volume_SaleInfo_OffersItem_RentalDuration = Volume_SaleInfo_OffersItem_RentalDuration
  { count :: (Core.Maybe Core.Double),
    unit :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SaleInfo_OffersItem_RentalDuration' with the minimum fields required to make a request.
newVolume_SaleInfo_OffersItem_RentalDuration ::
  Volume_SaleInfo_OffersItem_RentalDuration
newVolume_SaleInfo_OffersItem_RentalDuration =
  Volume_SaleInfo_OffersItem_RentalDuration
    { count = Core.Nothing,
      unit = Core.Nothing
    }

instance Core.FromJSON Volume_SaleInfo_OffersItem_RentalDuration where
  parseJSON =
    Core.withObject
      "Volume_SaleInfo_OffersItem_RentalDuration"
      ( \o ->
          Volume_SaleInfo_OffersItem_RentalDuration
            Core.<$> (o Core..:? "count")
            Core.<*> (o Core..:? "unit")
      )

instance Core.ToJSON Volume_SaleInfo_OffersItem_RentalDuration where
  toJSON Volume_SaleInfo_OffersItem_RentalDuration {..} =
    Core.object
      ( Core.catMaybes
          [("count" Core..=) Core.<$> count, ("unit" Core..=) Core.<$> unit]
      )

-- | Offer retail (=discounted) price in Micros
--
-- /See:/ 'newVolume_SaleInfo_OffersItem_RetailPrice' smart constructor.
data Volume_SaleInfo_OffersItem_RetailPrice = Volume_SaleInfo_OffersItem_RetailPrice
  { amountInMicros :: (Core.Maybe Core.Double),
    currencyCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SaleInfo_OffersItem_RetailPrice' with the minimum fields required to make a request.
newVolume_SaleInfo_OffersItem_RetailPrice ::
  Volume_SaleInfo_OffersItem_RetailPrice
newVolume_SaleInfo_OffersItem_RetailPrice =
  Volume_SaleInfo_OffersItem_RetailPrice
    { amountInMicros =
        Core.Nothing,
      currencyCode = Core.Nothing
    }

instance Core.FromJSON Volume_SaleInfo_OffersItem_RetailPrice where
  parseJSON =
    Core.withObject
      "Volume_SaleInfo_OffersItem_RetailPrice"
      ( \o ->
          Volume_SaleInfo_OffersItem_RetailPrice
            Core.<$> (o Core..:? "amountInMicros")
            Core.<*> (o Core..:? "currencyCode")
      )

instance Core.ToJSON Volume_SaleInfo_OffersItem_RetailPrice where
  toJSON Volume_SaleInfo_OffersItem_RetailPrice {..} =
    Core.object
      ( Core.catMaybes
          [ ("amountInMicros" Core..=) Core.<$> amountInMicros,
            ("currencyCode" Core..=) Core.<$> currencyCode
          ]
      )

-- | The actual selling price of the book. This is the same as the suggested retail or list price unless there are offers or discounts on this volume. (In LITE projection.)
--
-- /See:/ 'newVolume_SaleInfo_RetailPrice' smart constructor.
data Volume_SaleInfo_RetailPrice = Volume_SaleInfo_RetailPrice
  { -- | Amount in the currency listed below. (In LITE projection.)
    amount :: (Core.Maybe Core.Double),
    -- | An ISO 4217, three-letter currency code. (In LITE projection.)
    currencyCode :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SaleInfo_RetailPrice' with the minimum fields required to make a request.
newVolume_SaleInfo_RetailPrice ::
  Volume_SaleInfo_RetailPrice
newVolume_SaleInfo_RetailPrice =
  Volume_SaleInfo_RetailPrice
    { amount = Core.Nothing,
      currencyCode = Core.Nothing
    }

instance Core.FromJSON Volume_SaleInfo_RetailPrice where
  parseJSON =
    Core.withObject
      "Volume_SaleInfo_RetailPrice"
      ( \o ->
          Volume_SaleInfo_RetailPrice
            Core.<$> (o Core..:? "amount")
            Core.<*> (o Core..:? "currencyCode")
      )

instance Core.ToJSON Volume_SaleInfo_RetailPrice where
  toJSON Volume_SaleInfo_RetailPrice {..} =
    Core.object
      ( Core.catMaybes
          [ ("amount" Core..=) Core.<$> amount,
            ("currencyCode" Core..=) Core.<$> currencyCode
          ]
      )

-- | Search result information related to this volume.
--
-- /See:/ 'newVolume_SearchInfo' smart constructor.
newtype Volume_SearchInfo = Volume_SearchInfo
  { -- | A text snippet containing the search query.
    textSnippet :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_SearchInfo' with the minimum fields required to make a request.
newVolume_SearchInfo ::
  Volume_SearchInfo
newVolume_SearchInfo =
  Volume_SearchInfo {textSnippet = Core.Nothing}

instance Core.FromJSON Volume_SearchInfo where
  parseJSON =
    Core.withObject
      "Volume_SearchInfo"
      (\o -> Volume_SearchInfo Core.<$> (o Core..:? "textSnippet"))

instance Core.ToJSON Volume_SearchInfo where
  toJSON Volume_SearchInfo {..} =
    Core.object
      (Core.catMaybes [("textSnippet" Core..=) Core.<$> textSnippet])

-- | User specific information related to this volume. (e.g. page this user last read or whether they purchased this book)
--
-- /See:/ 'newVolume_UserInfo' smart constructor.
data Volume_UserInfo = Volume_UserInfo
  { -- | Timestamp when this volume was acquired by the user. (RFC 3339 UTC date-time format) Acquiring includes purchase, user upload, receiving family sharing, etc.
    acquiredTime :: (Core.Maybe Core.Text),
    -- | How this volume was acquired.
    acquisitionType :: (Core.Maybe Core.Int32),
    -- | Copy\/Paste accounting information.
    copy :: (Core.Maybe Volume_UserInfo_Copy),
    -- | Whether this volume is purchased, sample, pd download etc.
    entitlementType :: (Core.Maybe Core.Int32),
    -- | Information on the ability to share with the family.
    familySharing :: (Core.Maybe Volume_UserInfo_FamilySharing),
    -- | Whether or not the user shared this volume with the family.
    isFamilySharedFromUser :: (Core.Maybe Core.Bool),
    -- | Whether or not the user received this volume through family sharing.
    isFamilySharedToUser :: (Core.Maybe Core.Bool),
    -- | Deprecated: Replaced by familySharing.
    isFamilySharingAllowed :: (Core.Maybe Core.Bool),
    -- | Deprecated: Replaced by familySharing.
    isFamilySharingDisabledByFop :: (Core.Maybe Core.Bool),
    -- | Whether or not this volume is currently in \"my books.\"
    isInMyBooks :: (Core.Maybe Core.Bool),
    -- | Whether or not this volume was pre-ordered by the authenticated user making the request. (In LITE projection.)
    isPreordered :: (Core.Maybe Core.Bool),
    -- | Whether or not this volume was purchased by the authenticated user making the request. (In LITE projection.)
    isPurchased :: (Core.Maybe Core.Bool),
    -- | Whether or not this volume was user uploaded.
    isUploaded :: (Core.Maybe Core.Bool),
    -- | The user\'s current reading position in the volume, if one is available. (In LITE projection.)
    readingPosition :: (Core.Maybe ReadingPosition),
    -- | Period during this book is\/was a valid rental.
    rentalPeriod :: (Core.Maybe Volume_UserInfo_RentalPeriod),
    -- | Whether this book is an active or an expired rental.
    rentalState :: (Core.Maybe Core.Text),
    -- | This user\'s review of this volume, if one exists.
    review :: (Core.Maybe Review),
    -- | Timestamp when this volume was last modified by a user action, such as a reading position update, volume purchase or writing a review. (RFC 3339 UTC date-time format).
    updated :: (Core.Maybe Core.Text),
    userUploadedVolumeInfo :: (Core.Maybe Volume_UserInfo_UserUploadedVolumeInfo)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_UserInfo' with the minimum fields required to make a request.
newVolume_UserInfo ::
  Volume_UserInfo
newVolume_UserInfo =
  Volume_UserInfo
    { acquiredTime = Core.Nothing,
      acquisitionType = Core.Nothing,
      copy = Core.Nothing,
      entitlementType = Core.Nothing,
      familySharing = Core.Nothing,
      isFamilySharedFromUser = Core.Nothing,
      isFamilySharedToUser = Core.Nothing,
      isFamilySharingAllowed = Core.Nothing,
      isFamilySharingDisabledByFop = Core.Nothing,
      isInMyBooks = Core.Nothing,
      isPreordered = Core.Nothing,
      isPurchased = Core.Nothing,
      isUploaded = Core.Nothing,
      readingPosition = Core.Nothing,
      rentalPeriod = Core.Nothing,
      rentalState = Core.Nothing,
      review = Core.Nothing,
      updated = Core.Nothing,
      userUploadedVolumeInfo = Core.Nothing
    }

instance Core.FromJSON Volume_UserInfo where
  parseJSON =
    Core.withObject
      "Volume_UserInfo"
      ( \o ->
          Volume_UserInfo
            Core.<$> (o Core..:? "acquiredTime")
            Core.<*> (o Core..:? "acquisitionType")
            Core.<*> (o Core..:? "copy")
            Core.<*> (o Core..:? "entitlementType")
            Core.<*> (o Core..:? "familySharing")
            Core.<*> (o Core..:? "isFamilySharedFromUser")
            Core.<*> (o Core..:? "isFamilySharedToUser")
            Core.<*> (o Core..:? "isFamilySharingAllowed")
            Core.<*> (o Core..:? "isFamilySharingDisabledByFop")
            Core.<*> (o Core..:? "isInMyBooks")
            Core.<*> (o Core..:? "isPreordered")
            Core.<*> (o Core..:? "isPurchased")
            Core.<*> (o Core..:? "isUploaded")
            Core.<*> (o Core..:? "readingPosition")
            Core.<*> (o Core..:? "rentalPeriod")
            Core.<*> (o Core..:? "rentalState")
            Core.<*> (o Core..:? "review")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "userUploadedVolumeInfo")
      )

instance Core.ToJSON Volume_UserInfo where
  toJSON Volume_UserInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("acquiredTime" Core..=) Core.<$> acquiredTime,
            ("acquisitionType" Core..=) Core.<$> acquisitionType,
            ("copy" Core..=) Core.<$> copy,
            ("entitlementType" Core..=) Core.<$> entitlementType,
            ("familySharing" Core..=) Core.<$> familySharing,
            ("isFamilySharedFromUser" Core..=) Core.<$> isFamilySharedFromUser,
            ("isFamilySharedToUser" Core..=) Core.<$> isFamilySharedToUser,
            ("isFamilySharingAllowed" Core..=) Core.<$> isFamilySharingAllowed,
            ("isFamilySharingDisabledByFop" Core..=)
              Core.<$> isFamilySharingDisabledByFop,
            ("isInMyBooks" Core..=) Core.<$> isInMyBooks,
            ("isPreordered" Core..=) Core.<$> isPreordered,
            ("isPurchased" Core..=) Core.<$> isPurchased,
            ("isUploaded" Core..=) Core.<$> isUploaded,
            ("readingPosition" Core..=) Core.<$> readingPosition,
            ("rentalPeriod" Core..=) Core.<$> rentalPeriod,
            ("rentalState" Core..=) Core.<$> rentalState,
            ("review" Core..=) Core.<$> review,
            ("updated" Core..=) Core.<$> updated,
            ("userUploadedVolumeInfo" Core..=)
              Core.<$> userUploadedVolumeInfo
          ]
      )

-- | Copy\/Paste accounting information.
--
-- /See:/ 'newVolume_UserInfo_Copy' smart constructor.
data Volume_UserInfo_Copy = Volume_UserInfo_Copy
  { allowedCharacterCount :: (Core.Maybe Core.Int32),
    limitType :: (Core.Maybe Core.Text),
    remainingCharacterCount :: (Core.Maybe Core.Int32),
    updated :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_UserInfo_Copy' with the minimum fields required to make a request.
newVolume_UserInfo_Copy ::
  Volume_UserInfo_Copy
newVolume_UserInfo_Copy =
  Volume_UserInfo_Copy
    { allowedCharacterCount = Core.Nothing,
      limitType = Core.Nothing,
      remainingCharacterCount = Core.Nothing,
      updated = Core.Nothing
    }

instance Core.FromJSON Volume_UserInfo_Copy where
  parseJSON =
    Core.withObject
      "Volume_UserInfo_Copy"
      ( \o ->
          Volume_UserInfo_Copy
            Core.<$> (o Core..:? "allowedCharacterCount")
            Core.<*> (o Core..:? "limitType")
            Core.<*> (o Core..:? "remainingCharacterCount")
            Core.<*> (o Core..:? "updated")
      )

instance Core.ToJSON Volume_UserInfo_Copy where
  toJSON Volume_UserInfo_Copy {..} =
    Core.object
      ( Core.catMaybes
          [ ("allowedCharacterCount" Core..=) Core.<$> allowedCharacterCount,
            ("limitType" Core..=) Core.<$> limitType,
            ("remainingCharacterCount" Core..=)
              Core.<$> remainingCharacterCount,
            ("updated" Core..=) Core.<$> updated
          ]
      )

-- | Information on the ability to share with the family.
--
-- /See:/ 'newVolume_UserInfo_FamilySharing' smart constructor.
data Volume_UserInfo_FamilySharing = Volume_UserInfo_FamilySharing
  { -- | The role of the user in the family.
    familyRole :: (Core.Maybe Core.Text),
    -- | Whether or not this volume can be shared with the family by the user. This includes sharing eligibility of both the volume and the user. If the value is true, the user can initiate a family sharing action.
    isSharingAllowed :: (Core.Maybe Core.Bool),
    -- | Whether or not sharing this volume is temporarily disabled due to issues with the Family Wallet.
    isSharingDisabledByFop :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_UserInfo_FamilySharing' with the minimum fields required to make a request.
newVolume_UserInfo_FamilySharing ::
  Volume_UserInfo_FamilySharing
newVolume_UserInfo_FamilySharing =
  Volume_UserInfo_FamilySharing
    { familyRole = Core.Nothing,
      isSharingAllowed = Core.Nothing,
      isSharingDisabledByFop = Core.Nothing
    }

instance Core.FromJSON Volume_UserInfo_FamilySharing where
  parseJSON =
    Core.withObject
      "Volume_UserInfo_FamilySharing"
      ( \o ->
          Volume_UserInfo_FamilySharing
            Core.<$> (o Core..:? "familyRole")
            Core.<*> (o Core..:? "isSharingAllowed")
            Core.<*> (o Core..:? "isSharingDisabledByFop")
      )

instance Core.ToJSON Volume_UserInfo_FamilySharing where
  toJSON Volume_UserInfo_FamilySharing {..} =
    Core.object
      ( Core.catMaybes
          [ ("familyRole" Core..=) Core.<$> familyRole,
            ("isSharingAllowed" Core..=) Core.<$> isSharingAllowed,
            ("isSharingDisabledByFop" Core..=)
              Core.<$> isSharingDisabledByFop
          ]
      )

-- | Period during this book is\/was a valid rental.
--
-- /See:/ 'newVolume_UserInfo_RentalPeriod' smart constructor.
data Volume_UserInfo_RentalPeriod = Volume_UserInfo_RentalPeriod
  { endUtcSec :: (Core.Maybe Core.Int64),
    startUtcSec :: (Core.Maybe Core.Int64)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_UserInfo_RentalPeriod' with the minimum fields required to make a request.
newVolume_UserInfo_RentalPeriod ::
  Volume_UserInfo_RentalPeriod
newVolume_UserInfo_RentalPeriod =
  Volume_UserInfo_RentalPeriod
    { endUtcSec = Core.Nothing,
      startUtcSec = Core.Nothing
    }

instance Core.FromJSON Volume_UserInfo_RentalPeriod where
  parseJSON =
    Core.withObject
      "Volume_UserInfo_RentalPeriod"
      ( \o ->
          Volume_UserInfo_RentalPeriod
            Core.<$> (o Core..:? "endUtcSec" Core.<&> Core.fmap Core.fromAsText)
            Core.<*> (o Core..:? "startUtcSec" Core.<&> Core.fmap Core.fromAsText)
      )

instance Core.ToJSON Volume_UserInfo_RentalPeriod where
  toJSON Volume_UserInfo_RentalPeriod {..} =
    Core.object
      ( Core.catMaybes
          [ ("endUtcSec" Core..=) Core.. Core.AsText Core.<$> endUtcSec,
            ("startUtcSec" Core..=) Core.. Core.AsText Core.<$> startUtcSec
          ]
      )

--
-- /See:/ 'newVolume_UserInfo_UserUploadedVolumeInfo' smart constructor.
newtype Volume_UserInfo_UserUploadedVolumeInfo = Volume_UserInfo_UserUploadedVolumeInfo
  { processingState :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_UserInfo_UserUploadedVolumeInfo' with the minimum fields required to make a request.
newVolume_UserInfo_UserUploadedVolumeInfo ::
  Volume_UserInfo_UserUploadedVolumeInfo
newVolume_UserInfo_UserUploadedVolumeInfo =
  Volume_UserInfo_UserUploadedVolumeInfo
    { processingState =
        Core.Nothing
    }

instance Core.FromJSON Volume_UserInfo_UserUploadedVolumeInfo where
  parseJSON =
    Core.withObject
      "Volume_UserInfo_UserUploadedVolumeInfo"
      ( \o ->
          Volume_UserInfo_UserUploadedVolumeInfo
            Core.<$> (o Core..:? "processingState")
      )

instance Core.ToJSON Volume_UserInfo_UserUploadedVolumeInfo where
  toJSON Volume_UserInfo_UserUploadedVolumeInfo {..} =
    Core.object
      ( Core.catMaybes
          [("processingState" Core..=) Core.<$> processingState]
      )

-- | General volume information.
--
-- /See:/ 'newVolume_VolumeInfo' smart constructor.
data Volume_VolumeInfo = Volume_VolumeInfo
  { -- | Whether anonymous logging should be allowed.
    allowAnonLogging :: (Core.Maybe Core.Bool),
    -- | The names of the authors and\/or editors for this volume. (In LITE projection)
    authors :: (Core.Maybe [Core.Text]),
    -- | The mean review rating for this volume. (min = 1.0, max = 5.0)
    averageRating :: (Core.Maybe Core.Double),
    -- | Canonical URL for a volume. (In LITE projection.)
    canonicalVolumeLink :: (Core.Maybe Core.Text),
    -- | A list of subject categories, such as \"Fiction\", \"Suspense\", etc.
    categories :: (Core.Maybe [Core.Text]),
    -- | Whether the volume has comics content.
    comicsContent :: (Core.Maybe Core.Bool),
    -- | An identifier for the version of the volume content (text & images). (In LITE projection)
    contentVersion :: (Core.Maybe Core.Text),
    -- | A synopsis of the volume. The text of the description is formatted in HTML and includes simple formatting elements, such as b, i, and br tags. (In LITE projection.)
    description :: (Core.Maybe Core.Text),
    -- | Physical dimensions of this volume.
    dimensions :: (Core.Maybe Volume_VolumeInfo_Dimensions),
    -- | A list of image links for all the sizes that are available. (In LITE projection.)
    imageLinks :: (Core.Maybe Volume_VolumeInfo_ImageLinks),
    -- | Industry standard identifiers for this volume.
    industryIdentifiers :: (Core.Maybe [Volume_VolumeInfo_IndustryIdentifiersItem]),
    -- | URL to view information about this volume on the Google Books site. (In LITE projection)
    infoLink :: (Core.Maybe Core.Text),
    -- | Best language for this volume (based on content). It is the two-letter ISO 639-1 code such as \'fr\', \'en\', etc.
    language :: (Core.Maybe Core.Text),
    -- | The main category to which this volume belongs. It will be the category from the categories list returned below that has the highest weight.
    mainCategory :: (Core.Maybe Core.Text),
    maturityRating :: (Core.Maybe Core.Text),
    -- | Total number of pages as per publisher metadata.
    pageCount :: (Core.Maybe Core.Int32),
    -- | A top-level summary of the panelization info in this volume.
    panelizationSummary :: (Core.Maybe Volume_VolumeInfo_PanelizationSummary),
    -- | URL to preview this volume on the Google Books site.
    previewLink :: (Core.Maybe Core.Text),
    -- | Type of publication of this volume. Possible values are BOOK or MAGAZINE.
    printType :: (Core.Maybe Core.Text),
    -- | Total number of printed pages in generated pdf representation.
    printedPageCount :: (Core.Maybe Core.Int32),
    -- | Date of publication. (In LITE projection.)
    publishedDate :: (Core.Maybe Core.Text),
    -- | Publisher of this volume. (In LITE projection.)
    publisher :: (Core.Maybe Core.Text),
    -- | The number of review ratings for this volume.
    ratingsCount :: (Core.Maybe Core.Int32),
    -- | The reading modes available for this volume.
    readingModes :: (Core.Maybe Volume_VolumeInfo_ReadingModes),
    -- | Total number of sample pages as per publisher metadata.
    samplePageCount :: (Core.Maybe Core.Int32),
    seriesInfo :: (Core.Maybe Volumeseriesinfo),
    -- | Volume subtitle. (In LITE projection.)
    subtitle :: (Core.Maybe Core.Text),
    -- | Volume title. (In LITE projection.)
    title :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_VolumeInfo' with the minimum fields required to make a request.
newVolume_VolumeInfo ::
  Volume_VolumeInfo
newVolume_VolumeInfo =
  Volume_VolumeInfo
    { allowAnonLogging = Core.Nothing,
      authors = Core.Nothing,
      averageRating = Core.Nothing,
      canonicalVolumeLink = Core.Nothing,
      categories = Core.Nothing,
      comicsContent = Core.Nothing,
      contentVersion = Core.Nothing,
      description = Core.Nothing,
      dimensions = Core.Nothing,
      imageLinks = Core.Nothing,
      industryIdentifiers = Core.Nothing,
      infoLink = Core.Nothing,
      language = Core.Nothing,
      mainCategory = Core.Nothing,
      maturityRating = Core.Nothing,
      pageCount = Core.Nothing,
      panelizationSummary = Core.Nothing,
      previewLink = Core.Nothing,
      printType = Core.Nothing,
      printedPageCount = Core.Nothing,
      publishedDate = Core.Nothing,
      publisher = Core.Nothing,
      ratingsCount = Core.Nothing,
      readingModes = Core.Nothing,
      samplePageCount = Core.Nothing,
      seriesInfo = Core.Nothing,
      subtitle = Core.Nothing,
      title = Core.Nothing
    }

instance Core.FromJSON Volume_VolumeInfo where
  parseJSON =
    Core.withObject
      "Volume_VolumeInfo"
      ( \o ->
          Volume_VolumeInfo
            Core.<$> (o Core..:? "allowAnonLogging")
            Core.<*> (o Core..:? "authors")
            Core.<*> (o Core..:? "averageRating")
            Core.<*> (o Core..:? "canonicalVolumeLink")
            Core.<*> (o Core..:? "categories")
            Core.<*> (o Core..:? "comicsContent")
            Core.<*> (o Core..:? "contentVersion")
            Core.<*> (o Core..:? "description")
            Core.<*> (o Core..:? "dimensions")
            Core.<*> (o Core..:? "imageLinks")
            Core.<*> (o Core..:? "industryIdentifiers")
            Core.<*> (o Core..:? "infoLink")
            Core.<*> (o Core..:? "language")
            Core.<*> (o Core..:? "mainCategory")
            Core.<*> (o Core..:? "maturityRating")
            Core.<*> (o Core..:? "pageCount")
            Core.<*> (o Core..:? "panelizationSummary")
            Core.<*> (o Core..:? "previewLink")
            Core.<*> (o Core..:? "printType")
            Core.<*> (o Core..:? "printedPageCount")
            Core.<*> (o Core..:? "publishedDate")
            Core.<*> (o Core..:? "publisher")
            Core.<*> (o Core..:? "ratingsCount")
            Core.<*> (o Core..:? "readingModes")
            Core.<*> (o Core..:? "samplePageCount")
            Core.<*> (o Core..:? "seriesInfo")
            Core.<*> (o Core..:? "subtitle")
            Core.<*> (o Core..:? "title")
      )

instance Core.ToJSON Volume_VolumeInfo where
  toJSON Volume_VolumeInfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("allowAnonLogging" Core..=) Core.<$> allowAnonLogging,
            ("authors" Core..=) Core.<$> authors,
            ("averageRating" Core..=) Core.<$> averageRating,
            ("canonicalVolumeLink" Core..=) Core.<$> canonicalVolumeLink,
            ("categories" Core..=) Core.<$> categories,
            ("comicsContent" Core..=) Core.<$> comicsContent,
            ("contentVersion" Core..=) Core.<$> contentVersion,
            ("description" Core..=) Core.<$> description,
            ("dimensions" Core..=) Core.<$> dimensions,
            ("imageLinks" Core..=) Core.<$> imageLinks,
            ("industryIdentifiers" Core..=) Core.<$> industryIdentifiers,
            ("infoLink" Core..=) Core.<$> infoLink,
            ("language" Core..=) Core.<$> language,
            ("mainCategory" Core..=) Core.<$> mainCategory,
            ("maturityRating" Core..=) Core.<$> maturityRating,
            ("pageCount" Core..=) Core.<$> pageCount,
            ("panelizationSummary" Core..=) Core.<$> panelizationSummary,
            ("previewLink" Core..=) Core.<$> previewLink,
            ("printType" Core..=) Core.<$> printType,
            ("printedPageCount" Core..=) Core.<$> printedPageCount,
            ("publishedDate" Core..=) Core.<$> publishedDate,
            ("publisher" Core..=) Core.<$> publisher,
            ("ratingsCount" Core..=) Core.<$> ratingsCount,
            ("readingModes" Core..=) Core.<$> readingModes,
            ("samplePageCount" Core..=) Core.<$> samplePageCount,
            ("seriesInfo" Core..=) Core.<$> seriesInfo,
            ("subtitle" Core..=) Core.<$> subtitle,
            ("title" Core..=) Core.<$> title
          ]
      )

-- | Physical dimensions of this volume.
--
-- /See:/ 'newVolume_VolumeInfo_Dimensions' smart constructor.
data Volume_VolumeInfo_Dimensions = Volume_VolumeInfo_Dimensions
  { -- | Height or length of this volume (in cm).
    height :: (Core.Maybe Core.Text),
    -- | Thickness of this volume (in cm).
    thickness :: (Core.Maybe Core.Text),
    -- | Width of this volume (in cm).
    width :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_VolumeInfo_Dimensions' with the minimum fields required to make a request.
newVolume_VolumeInfo_Dimensions ::
  Volume_VolumeInfo_Dimensions
newVolume_VolumeInfo_Dimensions =
  Volume_VolumeInfo_Dimensions
    { height = Core.Nothing,
      thickness = Core.Nothing,
      width = Core.Nothing
    }

instance Core.FromJSON Volume_VolumeInfo_Dimensions where
  parseJSON =
    Core.withObject
      "Volume_VolumeInfo_Dimensions"
      ( \o ->
          Volume_VolumeInfo_Dimensions
            Core.<$> (o Core..:? "height")
            Core.<*> (o Core..:? "thickness")
            Core.<*> (o Core..:? "width")
      )

instance Core.ToJSON Volume_VolumeInfo_Dimensions where
  toJSON Volume_VolumeInfo_Dimensions {..} =
    Core.object
      ( Core.catMaybes
          [ ("height" Core..=) Core.<$> height,
            ("thickness" Core..=) Core.<$> thickness,
            ("width" Core..=) Core.<$> width
          ]
      )

-- | A list of image links for all the sizes that are available. (In LITE projection.)
--
-- /See:/ 'newVolume_VolumeInfo_ImageLinks' smart constructor.
data Volume_VolumeInfo_ImageLinks = Volume_VolumeInfo_ImageLinks
  { -- | Image link for extra large size (width of ~1280 pixels). (In LITE projection)
    extraLarge :: (Core.Maybe Core.Text),
    -- | Image link for large size (width of ~800 pixels). (In LITE projection)
    large :: (Core.Maybe Core.Text),
    -- | Image link for medium size (width of ~575 pixels). (In LITE projection)
    medium :: (Core.Maybe Core.Text),
    -- | Image link for small size (width of ~300 pixels). (In LITE projection)
    small :: (Core.Maybe Core.Text),
    -- | Image link for small thumbnail size (width of ~80 pixels). (In LITE projection)
    smallThumbnail :: (Core.Maybe Core.Text),
    -- | Image link for thumbnail size (width of ~128 pixels). (In LITE projection)
    thumbnail :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_VolumeInfo_ImageLinks' with the minimum fields required to make a request.
newVolume_VolumeInfo_ImageLinks ::
  Volume_VolumeInfo_ImageLinks
newVolume_VolumeInfo_ImageLinks =
  Volume_VolumeInfo_ImageLinks
    { extraLarge = Core.Nothing,
      large = Core.Nothing,
      medium = Core.Nothing,
      small = Core.Nothing,
      smallThumbnail = Core.Nothing,
      thumbnail = Core.Nothing
    }

instance Core.FromJSON Volume_VolumeInfo_ImageLinks where
  parseJSON =
    Core.withObject
      "Volume_VolumeInfo_ImageLinks"
      ( \o ->
          Volume_VolumeInfo_ImageLinks
            Core.<$> (o Core..:? "extraLarge")
            Core.<*> (o Core..:? "large")
            Core.<*> (o Core..:? "medium")
            Core.<*> (o Core..:? "small")
            Core.<*> (o Core..:? "smallThumbnail")
            Core.<*> (o Core..:? "thumbnail")
      )

instance Core.ToJSON Volume_VolumeInfo_ImageLinks where
  toJSON Volume_VolumeInfo_ImageLinks {..} =
    Core.object
      ( Core.catMaybes
          [ ("extraLarge" Core..=) Core.<$> extraLarge,
            ("large" Core..=) Core.<$> large,
            ("medium" Core..=) Core.<$> medium,
            ("small" Core..=) Core.<$> small,
            ("smallThumbnail" Core..=) Core.<$> smallThumbnail,
            ("thumbnail" Core..=) Core.<$> thumbnail
          ]
      )

--
-- /See:/ 'newVolume_VolumeInfo_IndustryIdentifiersItem' smart constructor.
data Volume_VolumeInfo_IndustryIdentifiersItem = Volume_VolumeInfo_IndustryIdentifiersItem
  { -- | Industry specific volume identifier.
    identifier :: (Core.Maybe Core.Text),
    -- | Identifier type. Possible values are ISBN/10, ISBN/13, ISSN and OTHER.
    type' :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_VolumeInfo_IndustryIdentifiersItem' with the minimum fields required to make a request.
newVolume_VolumeInfo_IndustryIdentifiersItem ::
  Volume_VolumeInfo_IndustryIdentifiersItem
newVolume_VolumeInfo_IndustryIdentifiersItem =
  Volume_VolumeInfo_IndustryIdentifiersItem
    { identifier =
        Core.Nothing,
      type' = Core.Nothing
    }

instance Core.FromJSON Volume_VolumeInfo_IndustryIdentifiersItem where
  parseJSON =
    Core.withObject
      "Volume_VolumeInfo_IndustryIdentifiersItem"
      ( \o ->
          Volume_VolumeInfo_IndustryIdentifiersItem
            Core.<$> (o Core..:? "identifier")
            Core.<*> (o Core..:? "type")
      )

instance Core.ToJSON Volume_VolumeInfo_IndustryIdentifiersItem where
  toJSON Volume_VolumeInfo_IndustryIdentifiersItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("identifier" Core..=) Core.<$> identifier,
            ("type" Core..=) Core.<$> type'
          ]
      )

-- | A top-level summary of the panelization info in this volume.
--
-- /See:/ 'newVolume_VolumeInfo_PanelizationSummary' smart constructor.
data Volume_VolumeInfo_PanelizationSummary = Volume_VolumeInfo_PanelizationSummary
  { containsEpubBubbles :: (Core.Maybe Core.Bool),
    containsImageBubbles :: (Core.Maybe Core.Bool),
    epubBubbleVersion :: (Core.Maybe Core.Text),
    imageBubbleVersion :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_VolumeInfo_PanelizationSummary' with the minimum fields required to make a request.
newVolume_VolumeInfo_PanelizationSummary ::
  Volume_VolumeInfo_PanelizationSummary
newVolume_VolumeInfo_PanelizationSummary =
  Volume_VolumeInfo_PanelizationSummary
    { containsEpubBubbles =
        Core.Nothing,
      containsImageBubbles = Core.Nothing,
      epubBubbleVersion = Core.Nothing,
      imageBubbleVersion = Core.Nothing
    }

instance Core.FromJSON Volume_VolumeInfo_PanelizationSummary where
  parseJSON =
    Core.withObject
      "Volume_VolumeInfo_PanelizationSummary"
      ( \o ->
          Volume_VolumeInfo_PanelizationSummary
            Core.<$> (o Core..:? "containsEpubBubbles")
            Core.<*> (o Core..:? "containsImageBubbles")
            Core.<*> (o Core..:? "epubBubbleVersion")
            Core.<*> (o Core..:? "imageBubbleVersion")
      )

instance Core.ToJSON Volume_VolumeInfo_PanelizationSummary where
  toJSON Volume_VolumeInfo_PanelizationSummary {..} =
    Core.object
      ( Core.catMaybes
          [ ("containsEpubBubbles" Core..=) Core.<$> containsEpubBubbles,
            ("containsImageBubbles" Core..=) Core.<$> containsImageBubbles,
            ("epubBubbleVersion" Core..=) Core.<$> epubBubbleVersion,
            ("imageBubbleVersion" Core..=) Core.<$> imageBubbleVersion
          ]
      )

-- | The reading modes available for this volume.
--
-- /See:/ 'newVolume_VolumeInfo_ReadingModes' smart constructor.
data Volume_VolumeInfo_ReadingModes = Volume_VolumeInfo_ReadingModes
  { image :: (Core.Maybe Core.Bool),
    text :: (Core.Maybe Core.Bool)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume_VolumeInfo_ReadingModes' with the minimum fields required to make a request.
newVolume_VolumeInfo_ReadingModes ::
  Volume_VolumeInfo_ReadingModes
newVolume_VolumeInfo_ReadingModes =
  Volume_VolumeInfo_ReadingModes
    { image = Core.Nothing,
      text = Core.Nothing
    }

instance Core.FromJSON Volume_VolumeInfo_ReadingModes where
  parseJSON =
    Core.withObject
      "Volume_VolumeInfo_ReadingModes"
      ( \o ->
          Volume_VolumeInfo_ReadingModes
            Core.<$> (o Core..:? "image")
            Core.<*> (o Core..:? "text")
      )

instance Core.ToJSON Volume_VolumeInfo_ReadingModes where
  toJSON Volume_VolumeInfo_ReadingModes {..} =
    Core.object
      ( Core.catMaybes
          [("image" Core..=) Core.<$> image, ("text" Core..=) Core.<$> text]
      )

--
-- /See:/ 'newVolume2' smart constructor.
data Volume2 = Volume2
  { -- | A list of volumes.
    items :: (Core.Maybe [Volume]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    nextPageToken :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volume2' with the minimum fields required to make a request.
newVolume2 ::
  Volume2
newVolume2 =
  Volume2
    { items = Core.Nothing,
      kind = Core.Nothing,
      nextPageToken = Core.Nothing
    }

instance Core.FromJSON Volume2 where
  parseJSON =
    Core.withObject
      "Volume2"
      ( \o ->
          Volume2
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "nextPageToken")
      )

instance Core.ToJSON Volume2 where
  toJSON Volume2 {..} =
    Core.object
      ( Core.catMaybes
          [ ("items" Core..=) Core.<$> items,
            ("kind" Core..=) Core.<$> kind,
            ("nextPageToken" Core..=) Core.<$> nextPageToken
          ]
      )

--
-- /See:/ 'newVolumeannotation' smart constructor.
data Volumeannotation = Volumeannotation
  { -- | The annotation data id for this volume annotation.
    annotationDataId :: (Core.Maybe Core.Text),
    -- | Link to get data for this annotation.
    annotationDataLink :: (Core.Maybe Core.Text),
    -- | The type of annotation this is.
    annotationType :: (Core.Maybe Core.Text),
    -- | The content ranges to identify the selected text.
    contentRanges :: (Core.Maybe Volumeannotation_ContentRanges),
    -- | Data for this annotation.
    data' :: (Core.Maybe Core.Text),
    -- | Indicates that this annotation is deleted.
    deleted :: (Core.Maybe Core.Bool),
    -- | Unique id of this volume annotation.
    id :: (Core.Maybe Core.Text),
    -- | Resource Type
    kind :: (Core.Maybe Core.Text),
    -- | The Layer this annotation is for.
    layerId :: (Core.Maybe Core.Text),
    -- | Pages the annotation spans.
    pageIds :: (Core.Maybe [Core.Text]),
    -- | Excerpt from the volume.
    selectedText :: (Core.Maybe Core.Text),
    -- | URL to this resource.
    selfLink :: (Core.Maybe Core.Text),
    -- | Timestamp for the last time this anntoation was updated. (RFC 3339 UTC date-time format).
    updated :: (Core.Maybe Core.Text),
    -- | The Volume this annotation is for.
    volumeId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volumeannotation' with the minimum fields required to make a request.
newVolumeannotation ::
  Volumeannotation
newVolumeannotation =
  Volumeannotation
    { annotationDataId = Core.Nothing,
      annotationDataLink = Core.Nothing,
      annotationType = Core.Nothing,
      contentRanges = Core.Nothing,
      data' = Core.Nothing,
      deleted = Core.Nothing,
      id = Core.Nothing,
      kind = Core.Nothing,
      layerId = Core.Nothing,
      pageIds = Core.Nothing,
      selectedText = Core.Nothing,
      selfLink = Core.Nothing,
      updated = Core.Nothing,
      volumeId = Core.Nothing
    }

instance Core.FromJSON Volumeannotation where
  parseJSON =
    Core.withObject
      "Volumeannotation"
      ( \o ->
          Volumeannotation
            Core.<$> (o Core..:? "annotationDataId")
            Core.<*> (o Core..:? "annotationDataLink")
            Core.<*> (o Core..:? "annotationType")
            Core.<*> (o Core..:? "contentRanges")
            Core.<*> (o Core..:? "data")
            Core.<*> (o Core..:? "deleted")
            Core.<*> (o Core..:? "id")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "layerId")
            Core.<*> (o Core..:? "pageIds")
            Core.<*> (o Core..:? "selectedText")
            Core.<*> (o Core..:? "selfLink")
            Core.<*> (o Core..:? "updated")
            Core.<*> (o Core..:? "volumeId")
      )

instance Core.ToJSON Volumeannotation where
  toJSON Volumeannotation {..} =
    Core.object
      ( Core.catMaybes
          [ ("annotationDataId" Core..=) Core.<$> annotationDataId,
            ("annotationDataLink" Core..=) Core.<$> annotationDataLink,
            ("annotationType" Core..=) Core.<$> annotationType,
            ("contentRanges" Core..=) Core.<$> contentRanges,
            ("data" Core..=) Core.<$> data',
            ("deleted" Core..=) Core.<$> deleted,
            ("id" Core..=) Core.<$> id,
            ("kind" Core..=) Core.<$> kind,
            ("layerId" Core..=) Core.<$> layerId,
            ("pageIds" Core..=) Core.<$> pageIds,
            ("selectedText" Core..=) Core.<$> selectedText,
            ("selfLink" Core..=) Core.<$> selfLink,
            ("updated" Core..=) Core.<$> updated,
            ("volumeId" Core..=) Core.<$> volumeId
          ]
      )

-- | The content ranges to identify the selected text.
--
-- /See:/ 'newVolumeannotation_ContentRanges' smart constructor.
data Volumeannotation_ContentRanges = Volumeannotation_ContentRanges
  { -- | Range in CFI format for this annotation for version above.
    cfiRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Content version applicable to ranges below.
    contentVersion :: (Core.Maybe Core.Text),
    -- | Range in GB image format for this annotation for version above.
    gbImageRange :: (Core.Maybe BooksAnnotationsRange),
    -- | Range in GB text format for this annotation for version above.
    gbTextRange :: (Core.Maybe BooksAnnotationsRange)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volumeannotation_ContentRanges' with the minimum fields required to make a request.
newVolumeannotation_ContentRanges ::
  Volumeannotation_ContentRanges
newVolumeannotation_ContentRanges =
  Volumeannotation_ContentRanges
    { cfiRange = Core.Nothing,
      contentVersion = Core.Nothing,
      gbImageRange = Core.Nothing,
      gbTextRange = Core.Nothing
    }

instance Core.FromJSON Volumeannotation_ContentRanges where
  parseJSON =
    Core.withObject
      "Volumeannotation_ContentRanges"
      ( \o ->
          Volumeannotation_ContentRanges
            Core.<$> (o Core..:? "cfiRange")
            Core.<*> (o Core..:? "contentVersion")
            Core.<*> (o Core..:? "gbImageRange")
            Core.<*> (o Core..:? "gbTextRange")
      )

instance Core.ToJSON Volumeannotation_ContentRanges where
  toJSON Volumeannotation_ContentRanges {..} =
    Core.object
      ( Core.catMaybes
          [ ("cfiRange" Core..=) Core.<$> cfiRange,
            ("contentVersion" Core..=) Core.<$> contentVersion,
            ("gbImageRange" Core..=) Core.<$> gbImageRange,
            ("gbTextRange" Core..=) Core.<$> gbTextRange
          ]
      )

--
-- /See:/ 'newVolumeannotations' smart constructor.
data Volumeannotations = Volumeannotations
  { -- | A list of volume annotations.
    items :: (Core.Maybe [Volumeannotation]),
    -- | Resource type
    kind :: (Core.Maybe Core.Text),
    -- | Token to pass in for pagination for the next page. This will not be present if this request does not have more results.
    nextPageToken :: (Core.Maybe Core.Text),
    -- | The total number of volume annotations found.
    totalItems :: (Core.Maybe Core.Int32),
    -- | The version string for all of the volume annotations in this layer (not just the ones in this response). Note: the version string doesn\'t apply to the annotation data, just the information in this response (e.g. the location of annotations in the book).
    version :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volumeannotations' with the minimum fields required to make a request.
newVolumeannotations ::
  Volumeannotations
newVolumeannotations =
  Volumeannotations
    { items = Core.Nothing,
      kind = Core.Nothing,
      nextPageToken = Core.Nothing,
      totalItems = Core.Nothing,
      version = Core.Nothing
    }

instance Core.FromJSON Volumeannotations where
  parseJSON =
    Core.withObject
      "Volumeannotations"
      ( \o ->
          Volumeannotations
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "nextPageToken")
            Core.<*> (o Core..:? "totalItems")
            Core.<*> (o Core..:? "version")
      )

instance Core.ToJSON Volumeannotations where
  toJSON Volumeannotations {..} =
    Core.object
      ( Core.catMaybes
          [ ("items" Core..=) Core.<$> items,
            ("kind" Core..=) Core.<$> kind,
            ("nextPageToken" Core..=) Core.<$> nextPageToken,
            ("totalItems" Core..=) Core.<$> totalItems,
            ("version" Core..=) Core.<$> version
          ]
      )

--
-- /See:/ 'newVolumes' smart constructor.
data Volumes = Volumes
  { -- | A list of volumes.
    items :: (Core.Maybe [Volume]),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | Total number of volumes found. This might be greater than the number of volumes returned in this response if results have been paginated.
    totalItems :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volumes' with the minimum fields required to make a request.
newVolumes ::
  Volumes
newVolumes =
  Volumes
    { items = Core.Nothing,
      kind = Core.Nothing,
      totalItems = Core.Nothing
    }

instance Core.FromJSON Volumes where
  parseJSON =
    Core.withObject
      "Volumes"
      ( \o ->
          Volumes
            Core.<$> (o Core..:? "items")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "totalItems")
      )

instance Core.ToJSON Volumes where
  toJSON Volumes {..} =
    Core.object
      ( Core.catMaybes
          [ ("items" Core..=) Core.<$> items,
            ("kind" Core..=) Core.<$> kind,
            ("totalItems" Core..=) Core.<$> totalItems
          ]
      )

--
-- /See:/ 'newVolumeseriesinfo' smart constructor.
data Volumeseriesinfo = Volumeseriesinfo
  { -- | The display number string. This should be used only for display purposes and the actual sequence should be inferred from the below orderNumber.
    bookDisplayNumber :: (Core.Maybe Core.Text),
    -- | Resource type.
    kind :: (Core.Maybe Core.Text),
    -- | Short book title in the context of the series.
    shortSeriesBookTitle :: (Core.Maybe Core.Text),
    volumeSeries :: (Core.Maybe [Volumeseriesinfo_VolumeSeriesItem])
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volumeseriesinfo' with the minimum fields required to make a request.
newVolumeseriesinfo ::
  Volumeseriesinfo
newVolumeseriesinfo =
  Volumeseriesinfo
    { bookDisplayNumber = Core.Nothing,
      kind = Core.Nothing,
      shortSeriesBookTitle = Core.Nothing,
      volumeSeries = Core.Nothing
    }

instance Core.FromJSON Volumeseriesinfo where
  parseJSON =
    Core.withObject
      "Volumeseriesinfo"
      ( \o ->
          Volumeseriesinfo
            Core.<$> (o Core..:? "bookDisplayNumber")
            Core.<*> (o Core..:? "kind")
            Core.<*> (o Core..:? "shortSeriesBookTitle")
            Core.<*> (o Core..:? "volumeSeries")
      )

instance Core.ToJSON Volumeseriesinfo where
  toJSON Volumeseriesinfo {..} =
    Core.object
      ( Core.catMaybes
          [ ("bookDisplayNumber" Core..=) Core.<$> bookDisplayNumber,
            ("kind" Core..=) Core.<$> kind,
            ("shortSeriesBookTitle" Core..=) Core.<$> shortSeriesBookTitle,
            ("volumeSeries" Core..=) Core.<$> volumeSeries
          ]
      )

--
-- /See:/ 'newVolumeseriesinfo_VolumeSeriesItem' smart constructor.
data Volumeseriesinfo_VolumeSeriesItem = Volumeseriesinfo_VolumeSeriesItem
  { -- | List of issues. Applicable only for Collection Edition and Omnibus.
    issue :: (Core.Maybe [Volumeseriesinfo_VolumeSeriesItem_IssueItem]),
    -- | The book order number in the series.
    orderNumber :: (Core.Maybe Core.Int32),
    -- | The book type in the context of series. Examples - Single Issue, Collection Edition, etc.
    seriesBookType :: (Core.Maybe Core.Text),
    -- | The series id.
    seriesId :: (Core.Maybe Core.Text)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volumeseriesinfo_VolumeSeriesItem' with the minimum fields required to make a request.
newVolumeseriesinfo_VolumeSeriesItem ::
  Volumeseriesinfo_VolumeSeriesItem
newVolumeseriesinfo_VolumeSeriesItem =
  Volumeseriesinfo_VolumeSeriesItem
    { issue = Core.Nothing,
      orderNumber = Core.Nothing,
      seriesBookType = Core.Nothing,
      seriesId = Core.Nothing
    }

instance Core.FromJSON Volumeseriesinfo_VolumeSeriesItem where
  parseJSON =
    Core.withObject
      "Volumeseriesinfo_VolumeSeriesItem"
      ( \o ->
          Volumeseriesinfo_VolumeSeriesItem
            Core.<$> (o Core..:? "issue")
            Core.<*> (o Core..:? "orderNumber")
            Core.<*> (o Core..:? "seriesBookType")
            Core.<*> (o Core..:? "seriesId")
      )

instance Core.ToJSON Volumeseriesinfo_VolumeSeriesItem where
  toJSON Volumeseriesinfo_VolumeSeriesItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("issue" Core..=) Core.<$> issue,
            ("orderNumber" Core..=) Core.<$> orderNumber,
            ("seriesBookType" Core..=) Core.<$> seriesBookType,
            ("seriesId" Core..=) Core.<$> seriesId
          ]
      )

--
-- /See:/ 'newVolumeseriesinfo_VolumeSeriesItem_IssueItem' smart constructor.
data Volumeseriesinfo_VolumeSeriesItem_IssueItem = Volumeseriesinfo_VolumeSeriesItem_IssueItem
  { issueDisplayNumber :: (Core.Maybe Core.Text),
    issueOrderNumber :: (Core.Maybe Core.Int32)
  }
  deriving (Core.Eq, Core.Show, Core.Generic)

-- | Creates a value of 'Volumeseriesinfo_VolumeSeriesItem_IssueItem' with the minimum fields required to make a request.
newVolumeseriesinfo_VolumeSeriesItem_IssueItem ::
  Volumeseriesinfo_VolumeSeriesItem_IssueItem
newVolumeseriesinfo_VolumeSeriesItem_IssueItem =
  Volumeseriesinfo_VolumeSeriesItem_IssueItem
    { issueDisplayNumber =
        Core.Nothing,
      issueOrderNumber = Core.Nothing
    }

instance Core.FromJSON Volumeseriesinfo_VolumeSeriesItem_IssueItem where
  parseJSON =
    Core.withObject
      "Volumeseriesinfo_VolumeSeriesItem_IssueItem"
      ( \o ->
          Volumeseriesinfo_VolumeSeriesItem_IssueItem
            Core.<$> (o Core..:? "issueDisplayNumber")
            Core.<*> (o Core..:? "issueOrderNumber")
      )

instance Core.ToJSON Volumeseriesinfo_VolumeSeriesItem_IssueItem where
  toJSON Volumeseriesinfo_VolumeSeriesItem_IssueItem {..} =
    Core.object
      ( Core.catMaybes
          [ ("issueDisplayNumber" Core..=) Core.<$> issueDisplayNumber,
            ("issueOrderNumber" Core..=) Core.<$> issueOrderNumber
          ]
      )