
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT License.
//
// Code generated by Microsoft (R) AutoRest C++ Code Generator.
// Changes may cause incorrect behavior and will be lost if the code is regenerated.
#pragma once

#include <cstdint>
#include <map>
#include <memory>
#include <string>
#include <type_traits>
#include <vector>

#include <azure/core/context.hpp>
#include <azure/core/datetime.hpp>
#include <azure/core/etag.hpp>
#include <azure/core/http/http.hpp>
#include <azure/core/internal/http/pipeline.hpp>
#include <azure/core/internal/strings.hpp>
#include <azure/core/io/body_stream.hpp>
#include <azure/core/nullable.hpp>
#include <azure/core/response.hpp>
#include <azure/core/url.hpp>
#include <azure/storage/common/storage_common.hpp>
#include <azure/storage/files/shares/dll_import_export.hpp>

namespace Azure { namespace Storage { namespace Files { namespace Shares {
  namespace _detail {
    /**
     * The version used for the operations to Azure storage services.
     */
    constexpr static const char* ApiVersion = "2020-02-10";
  } // namespace _detail
  namespace Models {
    /**
     * @brief The retention policy.
     */
    struct RetentionPolicy final
    {
      /**
       * Indicates whether a retention policy is enabled for the File service. If false, metrics
       * data is retained, and the user is responsible for deleting it.
       */
      bool Enabled = bool();
      /**
       * Indicates the number of days that metrics data should be retained. All data older than this
       * value will be deleted. Metrics data is deleted on a best-effort basis after the retention
       * period expires.
       */
      Nullable<int32_t> Days;
    };
    /**
     * @brief Storage Analytics metrics for file service.
     */
    struct Metrics final
    {
      /**
       * The version of Storage Analytics to configure.
       */
      std::string Version;
      /**
       * Indicates whether metrics are enabled for the File service.
       */
      bool Enabled = bool();
      /**
       * Indicates whether metrics should generate summary statistics for called API operations.
       */
      Nullable<bool> IncludeApis;
      /**
       * The retention policy.
       */
      Models::RetentionPolicy RetentionPolicy;
    };
    /**
     * @brief CORS is an HTTP feature that enables a web application running under one domain to
     * access resources in another domain. Web browsers implement a security restriction known as
     * same-origin policy that prevents a web page from calling APIs in a different domain; CORS
     * provides a secure way to allow one domain (the origin domain) to call APIs in another domain.
     */
    struct CorsRule final
    {
      /**
       * The origin domains that are permitted to make a request against the storage service via
       * CORS. The origin domain is the domain from which the request originates. Note that the
       * origin must be an exact case-sensitive match with the origin that the user age sends to the
       * service. You can also use the wildcard character '*' to allow all origin domains to make
       * requests via CORS.
       */
      std::string AllowedOrigins;
      /**
       * The methods (HTTP request verbs) that the origin domain may use for a CORS request. (comma
       * separated).
       */
      std::string AllowedMethods;
      /**
       * The request headers that the origin domain may specify on the CORS request.
       */
      std::string AllowedHeaders;
      /**
       * The response headers that may be sent in the response to the CORS request and exposed by
       * the browser to the request issuer.
       */
      std::string ExposedHeaders;
      /**
       * The maximum amount time that a browser should cache the preflight OPTIONS request.
       */
      int32_t MaxAgeInSeconds = int32_t();
    };
    /**
     * @brief Settings for SMB multichannel.
     */
    struct SmbMultichannel final
    {
      /**
       * If SMB multichannel is enabled.
       */
      bool Enabled = bool();
    };
    /**
     * @brief Settings for SMB protocol.
     */
    struct SmbSettings final
    {
      /**
       * Settings for SMB Multichannel.
       */
      SmbMultichannel Multichannel;
    };
    /**
     * @brief Protocol settings.
     */
    struct ProtocolSettings final
    {
      /**
       * Settings for SMB protocol.
       */
      SmbSettings Settings;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ServiceClient::SetProperties.
     */
    struct SetServicePropertiesResult final
    {
    };
    /**
     * @brief Storage service properties.
     */
    struct ShareServiceProperties final
    {
      /**
       * A summary of request statistics grouped by API in hourly aggregates for files.
       */
      Metrics HourMetrics;
      /**
       * A summary of request statistics grouped by API in minute aggregates for files.
       */
      Metrics MinuteMetrics;
      /**
       * The set of CORS rules.
       */
      std::vector<CorsRule> Cors;
      /**
       * Protocol settings.
       */
      Nullable<ProtocolSettings> Protocol;
    };
    /**
     * @brief Specifies the access tier of the share.
     */
    class AccessTier final {
    public:
      AccessTier() = default;
      explicit AccessTier(std::string value) : m_value(std::move(value)) {}
      bool operator==(const AccessTier& other) const { return m_value == other.m_value; }
      bool operator!=(const AccessTier& other) const { return !(*this == other); }
      const std::string& ToString() const { return m_value; }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessTier TransactionOptimized;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessTier Hot;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessTier Cool;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static AccessTier Premium;

    private:
      std::string m_value;
    };
    /**
     * @brief The current lease status of the share.
     */
    class LeaseStatus final {
    public:
      LeaseStatus() = default;
      explicit LeaseStatus(std::string value) : m_value(std::move(value)) {}
      bool operator==(const LeaseStatus& other) const { return m_value == other.m_value; }
      bool operator!=(const LeaseStatus& other) const { return !(*this == other); }
      const std::string& ToString() const { return m_value; }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseStatus Locked;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseStatus Unlocked;

    private:
      std::string m_value;
    };
    /**
     * @brief Lease state of the share.
     */
    class LeaseState final {
    public:
      LeaseState() = default;
      explicit LeaseState(std::string value) : m_value(std::move(value)) {}
      bool operator==(const LeaseState& other) const { return m_value == other.m_value; }
      bool operator!=(const LeaseState& other) const { return !(*this == other); }
      const std::string& ToString() const { return m_value; }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseState Available;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseState Leased;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseState Expired;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseState Breaking;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseState Broken;

    private:
      std::string m_value;
    };
    /**
     * @brief When a share is leased, specifies whether the lease is of infinite or fixed duration.
     */
    class LeaseDurationType final {
    public:
      LeaseDurationType() = default;
      explicit LeaseDurationType(std::string value) : m_value(std::move(value)) {}
      bool operator==(const LeaseDurationType& other) const { return m_value == other.m_value; }
      bool operator!=(const LeaseDurationType& other) const { return !(*this == other); }
      const std::string& ToString() const { return m_value; }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseDurationType Infinite;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static LeaseDurationType Fixed;

    private:
      std::string m_value;
    };
    /**
     * @brief Properties of a share.
     */
    struct ShareItemDetails final
    {
      DateTime LastModified;
      ETag Etag;
      int64_t Quota = int64_t();
      Nullable<int32_t> ProvisionedIops;
      Nullable<int32_t> ProvisionedIngressMBps;
      Nullable<int32_t> ProvisionedEgressMBps;
      Nullable<DateTime> NextAllowedQuotaDowngradeTime;
      Nullable<DateTime> DeletedOn;
      int32_t RemainingRetentionDays = int32_t();
      /**
       * Specifies the access tier of the share.
       */
      Nullable<Models::AccessTier> AccessTier;
      Nullable<DateTime> AccessTierChangedOn;
      Nullable<std::string> AccessTierTransitionState;
      /**
       * The current lease status of the share.
       */
      Models::LeaseStatus LeaseStatus;
      /**
       * Lease state of the share.
       */
      Models::LeaseState LeaseState;
      /**
       * When a share is leased, specifies whether the lease is of infinite or fixed duration.
       */
      LeaseDurationType LeaseDuration;
    };
    /**
     * @brief A listed Azure Storage share item.
     */
    struct ShareItem final
    {
      std::string Name;
      std::string Snapshot;
      bool Deleted = bool();
      std::string Version;
      /**
       * A set of name-value pairs associated with the share or file.
       */
      std::map<
          std::string,
          std::string,
          Core::_internal::StringExtensions::CaseInsensitiveComparator>
          Metadata;
      /**
       * Properties of a share.
       */
      ShareItemDetails Details;
    };
    /**
     * @brief Include this parameter to specify one or more datasets to include in the response.
     */
    enum class ListSharesIncludeFlags
    {
      None = 0,
      Snapshots = 1,
      Metadata = 2,
      Deleted = 4,
    };
    inline ListSharesIncludeFlags operator|(ListSharesIncludeFlags lhs, ListSharesIncludeFlags rhs)
    {
      using type = std::underlying_type_t<ListSharesIncludeFlags>;
      return static_cast<ListSharesIncludeFlags>(static_cast<type>(lhs) | static_cast<type>(rhs));
    }
    inline ListSharesIncludeFlags& operator|=(
        ListSharesIncludeFlags& lhs,
        ListSharesIncludeFlags rhs)
    {
      lhs = lhs | rhs;
      return lhs;
    }
    inline ListSharesIncludeFlags operator&(ListSharesIncludeFlags lhs, ListSharesIncludeFlags rhs)
    {
      using type = std::underlying_type_t<ListSharesIncludeFlags>;
      return static_cast<ListSharesIncludeFlags>(static_cast<type>(lhs) & static_cast<type>(rhs));
    }
    inline ListSharesIncludeFlags& operator&=(
        ListSharesIncludeFlags& lhs,
        ListSharesIncludeFlags rhs)
    {
      lhs = lhs & rhs;
      return lhs;
    }
    namespace _detail {
      /**
       * @brief An enumeration of shares.
       */
      struct ListSharesResponse final
      {
        std::string ServiceEndpoint;
        Nullable<std::string> Prefix;
        Nullable<std::string> Marker;
        Nullable<int32_t> MaxResults;
        /**
         * Array of ShareItem.
         */
        std::vector<ShareItem> ShareItems;
        std::string NextMarker;
      };
    } // namespace _detail
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::Create.
     */
    struct CreateShareResult final
    {
      /**
       * Indicates if the share was successfully created by this operation.
       */
      bool Created = true;
      /**
       * The ETag contains a value which represents the version of the share, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * share or its properties or metadata updates the last modified time. Operations on files do
       * not affect the last modified time of the share.
       */
      DateTime LastModified;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::GetProperties.
     */
    struct ShareProperties final
    {
      /**
       * Specifies the access tier of the share.
       */
      Nullable<Models::AccessTier> AccessTier;
      /**
       * A set of name-value pairs that contain the user-defined metadata of the share.
       */
      std::map<
          std::string,
          std::string,
          Core::_internal::StringExtensions::CaseInsensitiveComparator>
          Metadata;
      /**
       * The ETag contains a value that you can use to perform operations conditionally, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * share or its properties updates the last modified time. Operations on files do not affect
       * the last modified time of the share.
       */
      DateTime LastModified;
      /**
       * Returns the current share quota in GB.
       */
      int64_t Quota = int64_t();
      /**
       * Returns the current share provisioned IOPS.
       */
      Nullable<int32_t> ProvisionedIops;
      /**
       * Returns the current share provisioned ingress in megabytes per second.
       */
      Nullable<int32_t> ProvisionedIngressMBps;
      /**
       * Returns the current share provisioned egress in megabytes per second.
       */
      Nullable<int32_t> ProvisionedEgressMBps;
      /**
       * Returns the current share next allowed quota downgrade time.
       */
      Nullable<DateTime> NextAllowedQuotaDowngradeTime;
      /**
       * When a share is leased, specifies whether the lease is of infinite or fixed duration.
       */
      Nullable<LeaseDurationType> LeaseDuration;
      /**
       * Lease state of the share.
       */
      Nullable<Models::LeaseState> LeaseState;
      /**
       * The current lease status of the share.
       */
      Nullable<Models::LeaseStatus> LeaseStatus;
      /**
       * Returns the last modified time (in UTC) of the access tier of the share.
       */
      Nullable<DateTime> AccessTierChangedOn;
      /**
       * Returns the transition state between access tiers, when present.
       */
      Nullable<std::string> AccessTierTransitionState;
    };
    /**
     * @brief Specifies the option include to delete the base share and all of its snapshots.
     */
    class DeleteSnapshotsOption final {
    public:
      DeleteSnapshotsOption() = default;
      explicit DeleteSnapshotsOption(std::string value) : m_value(std::move(value)) {}
      bool operator==(const DeleteSnapshotsOption& other) const { return m_value == other.m_value; }
      bool operator!=(const DeleteSnapshotsOption& other) const { return !(*this == other); }
      const std::string& ToString() const { return m_value; }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static DeleteSnapshotsOption Include;

    private:
      std::string m_value;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::Delete.
     */
    struct DeleteShareResult final
    {
      /**
       * Indicates if the share was successfully deleted by this operation.
       */
      bool Deleted = true;
    };
    namespace _detail {
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::AcquireLease.
       */
      struct AcquireShareLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally, in
         * quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the share was last modified. Any operation that modifies the
         * share or its properties updates the last modified time. Operations on files do not affect
         * the last modified time of the share.
         */
        DateTime LastModified;
        /**
         * Uniquely identifies a share's lease.
         */
        std::string LeaseId;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::ReleaseLease.
       */
      struct ReleaseShareLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally, in
         * quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the share was last modified. Any operation that modifies the
         * share or its properties updates the last modified time. Operations on files do not affect
         * the last modified time of the share.
         */
        DateTime LastModified;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::ChangeLease.
       */
      struct ChangeShareLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally, in
         * quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the share was last modified. Any operation that modifies the
         * share or its properties updates the last modified time. Operations on files do not affect
         * the last modified time of the share.
         */
        DateTime LastModified;
        /**
         * Uniquely identifies a share's lease.
         */
        std::string LeaseId;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::RenewLease.
       */
      struct RenewShareLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally, in
         * quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the share was last modified. Any operation that modifies the
         * share or its properties updates the last modified time. Operations on files do not affect
         * the last modified time of the share.
         */
        DateTime LastModified;
        /**
         * Uniquely identifies a share's lease.
         */
        std::string LeaseId;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::BreakLease.
       */
      struct BreakShareLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally, in
         * quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the share was last modified. Any operation that modifies the
         * share or its properties updates the last modified time. Operations on files do not affect
         * the last modified time of the share.
         */
        DateTime LastModified;
        /**
         * Approximate time remaining in the lease period, in seconds.
         */
        int32_t LeaseTime = int32_t();
        /**
         * Uniquely identifies a share's lease.
         */
        std::string LeaseId;
      };
    } // namespace _detail
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::CreateSnapshot.
     */
    struct CreateShareSnapshotResult final
    {
      /**
       * This header is a DateTime value that uniquely identifies the share snapshot. The value of
       * this header may be used in subsequent requests to access the share snapshot. This value is
       * opaque.
       */
      std::string Snapshot;
      /**
       * The ETag contains a value which represents the version of the share snapshot, in quotes. A
       * share snapshot cannot be modified, so the ETag of a given share snapshot never changes.
       * However, if new metadata was supplied with the Snapshot Share request then the ETag of the
       * share snapshot differs from that of the base share. If no metadata was specified with the
       * request, the ETag of the share snapshot is identical to that of the base share at the time
       * the share snapshot was taken.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. A share snapshot cannot be modified,
       * so the last modified time of a given share snapshot never changes. However, if new metadata
       * was supplied with the Snapshot Share request then the last modified time of the share
       * snapshot differs from that of the base share. If no metadata was specified with the
       * request, the last modified time of the share snapshot is identical to that of the base
       * share at the time the share snapshot was taken.
       */
      DateTime LastModified;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::CreatePermission.
     */
    struct CreateSharePermissionResult final
    {
      /**
       * Key of the permission set for the directory/file.
       */
      std::string FilePermissionKey;
    };
    namespace _detail {
      /**
       * @brief A permission (a security descriptor) at the share level.
       */
      struct SharePermission final
      {
        /**
         * The permission in the Security Descriptor Definition Language (SDDL).
         */
        std::string Permission;
      };
    } // namespace _detail
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::SetProperties.
     */
    struct SetSharePropertiesResult final
    {
      /**
       * The ETag contains a value that you can use to perform operations conditionally, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * share or its properties updates the last modified time. Operations on files do not affect
       * the last modified time of the share.
       */
      DateTime LastModified;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::SetMetadata.
     */
    struct SetShareMetadataResult final
    {
      /**
       * The ETag contains a value that you can use to perform operations conditionally, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * share or its properties updates the last modified time. Operations on files do not affect
       * the last modified time of the share.
       */
      DateTime LastModified;
    };
    /**
     * @brief An Access policy.
     */
    struct AccessPolicy final
    {
      /**
       * The date-time the policy is active.
       */
      Nullable<DateTime> StartsOn;
      /**
       * The date-time the policy expires.
       */
      Nullable<DateTime> ExpiresOn;
      /**
       * The permissions for the ACL policy.
       */
      std::string Permission;
    };
    /**
     * @brief Signed identifier.
     */
    struct SignedIdentifier final
    {
      /**
       * A unique id.
       */
      std::string Id;
      /**
       * The access policy.
       */
      AccessPolicy Policy;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::GetAccessPolicy.
     */
    struct ShareAccessPolicy final
    {
      /**
       * A collection of signed identifiers.
       */
      std::vector<SignedIdentifier> SignedIdentifiers;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::ShareClient::SetAccessPolicy.
     */
    struct SetShareAccessPolicyResult final
    {
      /**
       * The ETag contains a value that you can use to perform operations conditionally, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * share or its properties updates the last modified time. Operations on files do not affect
       * the last modified time of the share.
       */
      DateTime LastModified;
    };
    /**
     * @brief Stats for the share.
     */
    struct ShareStatistics final
    {
      /**
       * The approximate size of the data stored in bytes. Note that this value may not include all
       * recently created or recently resized files.
       */
      int64_t ShareUsageInBytes = int64_t();
      /**
       * The ETag contains a value that you can use to perform operations conditionally, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * share or its properties updates the last modified time. Operations on files do not affect
       * the last modified time of the share.
       */
      DateTime LastModified;
    };
    /**
     * @brief Attributes for a file or directory.
     */
    class FileAttributes final {
    public:
      FileAttributes() = default;
      explicit FileAttributes(const std::string& value);
      bool operator==(const FileAttributes& other) const { return m_value == other.m_value; }
      bool operator!=(const FileAttributes& other) const { return !(*this == other); }
      std::string ToString() const;
      const std::vector<std::string>& GetValues() const { return m_value; }
      FileAttributes operator|(const FileAttributes& other) const;
      FileAttributes operator&(const FileAttributes& other) const;
      FileAttributes operator^(const FileAttributes& other) const;
      FileAttributes& operator|=(const FileAttributes& other)
      {
        *this = *this | other;
        return *this;
      }
      FileAttributes& operator&=(const FileAttributes& other)
      {
        *this = *this & other;
        return *this;
      }
      FileAttributes& operator^=(const FileAttributes& other)
      {
        *this = *this ^ other;
        return *this;
      }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes ReadOnly;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes Hidden;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes System;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes None;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes Directory;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes Archive;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes Temporary;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes Offline;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes NotContentIndexed;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static FileAttributes NoScrubData;

    private:
      std::vector<std::string> m_value;
    };
    /**
     * @brief The SMB related properties for the file.
     */
    struct FileSmbProperties final
    {
      /**
       * Permission key for the directory or file.
       */
      Nullable<std::string> PermissionKey;
      /**
       * Attributes for the file or directory.
       */
      FileAttributes Attributes;
      /**
       * Creation time for the file or directory.
       */
      Nullable<DateTime> CreatedOn;
      /**
       * Last write time for the file or directory.
       */
      Nullable<DateTime> LastWrittenOn;
      /**
       * Changed time for the file or directory.
       */
      Nullable<DateTime> ChangedOn;
      /**
       * The fileId of the file.
       */
      std::string FileId;
      /**
       * The parentId of the file.
       */
      std::string ParentFileId;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::DirectoryClient::Create.
     */
    struct CreateDirectoryResult final
    {
      /**
       * Indicates if the directory was successfully created by this operation.
       */
      bool Created = true;
      /**
       * The SMB related properties for the file.
       */
      FileSmbProperties SmbProperties;
      /**
       * The ETag contains a value which represents the version of the directory, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * directory or its properties updates the last modified time. Operations on files do not
       * affect the last modified time of the directory.
       */
      DateTime LastModified;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = bool();
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::DirectoryClient::GetProperties.
     */
    struct DirectoryProperties final
    {
      /**
       * The SMB related properties for the file.
       */
      FileSmbProperties SmbProperties;
      /**
       * A set of name-value pairs that contain metadata for the directory.
       */
      std::map<
          std::string,
          std::string,
          Core::_internal::StringExtensions::CaseInsensitiveComparator>
          Metadata;
      /**
       * The ETag contains a value that you can use to perform operations conditionally, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the Directory was last modified. Operations on files within the
       * directory do not affect the last modified time of the directory.
       */
      DateTime LastModified;
      /**
       * The value of this header is set to true if the directory metadata is completely encrypted
       * using the specified algorithm. Otherwise, the value is set to false.
       */
      bool IsServerEncrypted = bool();
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::DirectoryClient::Delete.
     */
    struct DeleteDirectoryResult final
    {
      /**
       * Indicates if the directory was successfully deleted by this operation.
       */
      bool Deleted = true;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::DirectoryClient::SetProperties.
     */
    struct SetDirectoryPropertiesResult final
    {
      /**
       * The SMB related properties for the file.
       */
      FileSmbProperties SmbProperties;
      /**
       * The ETag contains a value which represents the version of the file, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the directory was last modified. Any operation that modifies the
       * directory or its properties updates the last modified time. Operations on files do not
       * affect the last modified time of the directory.
       */
      DateTime LastModified;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = bool();
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::DirectoryClient::SetMetadata.
     */
    struct SetDirectoryMetadataResult final
    {
      /**
       * The ETag contains a value which represents the version of the directory, in quotes.
       */
      Azure::ETag ETag;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = bool();
    };
    /**
     * @brief A listed directory item.
     */
    struct DirectoryItem final
    {
      std::string Name;
    };
    /**
     * @brief File properties.
     */
    struct FileItemDetails final
    {
      /**
       * Content length of the file. This value may not be up-to-date since an SMB client may have
       * modified the file locally. The value of Content-Length may not reflect that fact until the
       * handle is closed or the op-lock is broken. To retrieve current property values, call Get
       * File Properties.
       */
      int64_t FileSize = int64_t();
    };
    /**
     * @brief A listed file item.
     */
    struct FileItem final
    {
      std::string Name;
      /**
       * File properties.
       */
      FileItemDetails Details;
    };
    namespace _detail {
      /**
       * @brief Abstract for entries that can be listed from Directory.
       */
      struct FilesAndDirectoriesListSegment final
      {
        /**
         * Array of DirectoryItem.
         */
        std::vector<DirectoryItem> DirectoryItems;
        /**
         * Array of FileItem.
         */
        std::vector<FileItem> FileItems;
      };
      /**
       * @brief An enumeration of directories and files.
       */
      struct ListFilesAndDirectoriesSegmentResponse final
      {
        std::string ServiceEndpoint;
        std::string ShareName;
        Nullable<std::string> ShareSnapshot;
        std::string DirectoryPath;
        std::string Prefix;
        Nullable<std::string> Marker;
        Nullable<int32_t> MaxResults;
        /**
         * Abstract for entries that can be listed from Directory.
         */
        FilesAndDirectoriesListSegment Segment;
        std::string NextMarker;
      };
    } // namespace _detail
    /**
     * @brief A listed Azure Storage handle item.
     */
    struct HandleItem final
    {
      /**
       * XSMB service handle ID.
       */
      std::string HandleId;
      /**
       * File or directory name including full path starting from share root.
       */
      std::string Path;
      /**
       * FileId uniquely identifies the file or directory.
       */
      std::string FileId;
      /**
       * ParentId uniquely identifies the parent directory of the object.
       */
      std::string ParentId;
      /**
       * SMB session ID in context of which the file handle was opened.
       */
      std::string SessionId;
      /**
       * Client IP that opened the handle.
       */
      std::string ClientIp;
      /**
       * Time when the session that previously opened the handle has last been reconnected. (UTC).
       */
      DateTime OpenedOn;
      /**
       * Time handle was last connected to (UTC).
       */
      DateTime LastReconnectedOn;
    };
    namespace _detail {
      /**
       * @brief Response type for
       * #Azure::Storage::Files::Shares::DirectoryClient::ForceCloseHandles.
       */
      struct ForceCloseDirectoryHandlesResult final
      {
        /**
         * A string describing next handle to be closed. It is returned when more handles need to be
         * closed to complete the request.
         */
        Nullable<std::string> ContinuationToken;
        /**
         * Contains count of number of handles closed.
         */
        int32_t NumberOfHandlesClosed = int32_t();
        /**
         * Contains count of number of handles that failed to close.
         */
        int32_t NumberOfHandlesFailedToClose = int32_t();
      };
    } // namespace _detail
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::Create.
     */
    struct CreateFileResult final
    {
      /**
       * Indicates if the file was successfully created by this operation.
       */
      bool Created = true;
      /**
       * The SMB related properties for the file.
       */
      FileSmbProperties SmbProperties;
      /**
       * The ETag contains a value which represents the version of the file, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the share was last modified. Any operation that modifies the
       * directory or its properties updates the last modified time. Operations on files do not
       * affect the last modified time of the directory.
       */
      DateTime LastModified;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = bool();
    };
    /**
     * @brief Standard HTTP properties supported files.
     */
    struct FileHttpHeaders final
    {
      /**
       * MIME content type of the file.
       */
      std::string ContentType;
      /**
       * Specifies which content encodings have been applied to the file.
       */
      std::string ContentEncoding;
      /**
       * Specifies the natural languages used by this file.
       */
      std::string ContentLanguage;
      /**
       * Hash of the file content.
       */
      Storage::ContentHash ContentHash;
      /**
       * Conveys additional information about how to process the resource payload, and also can be
       * used to attach additional metadata.
       */
      std::string ContentDisposition;
      /**
       * Specifies directives for caching mechanisms.
       */
      std::string CacheControl;
    };
    /**
     * @brief Status of a copy operation.
     */
    class CopyStatus final {
    public:
      CopyStatus() = default;
      explicit CopyStatus(std::string value) : m_value(std::move(value)) {}
      bool operator==(const CopyStatus& other) const { return m_value == other.m_value; }
      bool operator!=(const CopyStatus& other) const { return !(*this == other); }
      const std::string& ToString() const { return m_value; }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static CopyStatus Pending;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static CopyStatus Success;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static CopyStatus Aborted;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static CopyStatus Failed;

    private:
      std::string m_value;
    };
    struct DownloadFileDetails final
    {
      /**
       * The ETag contains a value that you can use to perform operations conditionally. If the
       * request version is 2011-08-18 or newer, the ETag value will be in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the file was last modified. Any operation that modifies the file,
       * including an update of the file's metadata or properties, changes the last-modified time of
       * the file.
       */
      DateTime LastModified;
      /**
       * A set of name-value pairs associated with the share or file.
       */
      std::map<
          std::string,
          std::string,
          Core::_internal::StringExtensions::CaseInsensitiveComparator>
          Metadata;
      /**
       *  String identifier for this copy operation. Use with Get File Properties to check the
       * status of this copy operation, or pass to Abort Copy File to abort a pending copy.
       */
      Nullable<std::string> CopyId;
      /**
       * URL up to 2 KB in length that specifies the source file or file used in the last attempted
       * Copy File operation where this file was the destination file. This header does not appear
       * if this file has never been the destination in a Copy File operation, or if this file has
       * been modified after a concluded Copy File operation using Set File Properties, Put File, or
       * Put Block List.
       */
      Nullable<std::string> CopySource;
      /**
       * Status of a copy operation.
       */
      Nullable<Models::CopyStatus> CopyStatus;
      /**
       * Only appears when x-ms-copy-status is failed or pending. Describes the cause of the last
       * fatal or non-fatal copy operation failure. This header does not appear if this file has
       * never been the destination in a Copy File operation, or if this file has been modified
       * after a concluded Copy File operation using Set File Properties, Put File, or Put Block
       * List.
       */
      Nullable<std::string> CopyStatusDescription;
      /**
       * Contains the number of bytes copied and the total bytes in the source in the last attempted
       * Copy File operation where this file was the destination file. Can show between 0 and
       * Content-Length bytes copied. This header does not appear if this file has never been the
       * destination in a Copy File operation, or if this file has been modified after a concluded
       * Copy File operation using Set File Properties, Put File, or Put Block List.
       */
      Nullable<std::string> CopyProgress;
      /**
       * Conclusion time of the last attempted Copy File operation where this file was the
       * destination file. This value can specify the time of a completed, aborted, or failed copy
       * attempt. This header does not appear if a copy is pending, if this file has never been the
       * destination in a Copy File operation, or if this file has been modified after a concluded
       * Copy File operation using Set File Properties, Put File, or Put Block List.
       */
      Nullable<DateTime> CopyCompletedOn;
      /**
       * True if the file data and metadata are completely encrypted using the specified algorithm.
       * Otherwise, the value is set to false (when the file is unencrypted, or if only parts of the
       * file/application metadata are encrypted).
       */
      bool IsServerEncrypted = bool();
      /**
       * The SMB related properties for the file.
       */
      FileSmbProperties SmbProperties;
      /**
       * When a share is leased, specifies whether the lease is of infinite or fixed duration.
       */
      Nullable<LeaseDurationType> LeaseDuration;
      /**
       * Lease state of the share.
       */
      Nullable<Models::LeaseState> LeaseState;
      /**
       * The current lease status of the share.
       */
      Nullable<Models::LeaseStatus> LeaseStatus;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::Download.
     */
    struct DownloadFileResult final
    {
      /**
       * Content of the file or file range.
       */
      std::unique_ptr<Core::IO::BodyStream> BodyStream;
      /**
       * Indicates the range of bytes returned.
       */
      Core::Http::HttpRange ContentRange;
      int64_t FileSize = int64_t();
      /**
       * MD5 hash for the downloaded range of data.
       */
      Nullable<ContentHash> TransactionalContentHash;
      /**
       * Standard HTTP properties supported files.
       */
      FileHttpHeaders HttpHeaders;
      DownloadFileDetails Details;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::GetProperties.
     */
    struct FileProperties final
    {
      /**
       * The SMB related properties for the file.
       */
      FileSmbProperties SmbProperties;
      /**
       * Standard HTTP properties supported files.
       */
      FileHttpHeaders HttpHeaders;
      /**
       * Returns the date and time the file was last modified. The date format follows RFC 1123. Any
       * operation that modifies the file or its properties updates the last modified time.
       */
      DateTime LastModified;
      /**
       * A set of name-value pairs associated with this file as user-defined metadata.
       */
      std::map<
          std::string,
          std::string,
          Core::_internal::StringExtensions::CaseInsensitiveComparator>
          Metadata;
      /**
       * The size of the file in bytes. This header returns the value of the 'x-ms-content-length'
       * header that is stored with the file.
       */
      int64_t FileSize = int64_t();
      /**
       * The ETag contains a value that you can use to perform operations conditionally, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Conclusion time of the last attempted Copy File operation where this file was the
       * destination file. This value can specify the time of a completed, aborted, or failed copy
       * attempt.
       */
      Nullable<DateTime> CopyCompletedOn;
      /**
       * Only appears when x-ms-copy-status is failed or pending. Describes cause of fatal or
       * non-fatal copy operation failure.
       */
      Nullable<std::string> CopyStatusDescription;
      /**
       * String identifier for the last attempted Copy File operation where this file was the
       * destination file.
       */
      Nullable<std::string> CopyId;
      /**
       * Contains the number of bytes copied and the total bytes in the source in the last attempted
       * Copy File operation where this file was the destination file. Can show between 0 and
       * Content-Length bytes copied.
       */
      Nullable<std::string> CopyProgress;
      /**
       * URL up to 2KB in length that specifies the source file used in the last attempted Copy File
       * operation where this file was the destination file.
       */
      Nullable<std::string> CopySource;
      /**
       * State of the copy operation identified by 'x-ms-copy-id'.
       */
      Nullable<Models::CopyStatus> CopyStatus;
      /**
       * The value of this header is set to true if the file data and application metadata are
       * completely encrypted using the specified algorithm. Otherwise, the value is set to false
       * (when the file is unencrypted, or if only parts of the file/application metadata are
       * encrypted).
       */
      bool IsServerEncrypted = bool();
      /**
       * When a file is leased, specifies whether the lease is of infinite or fixed duration.
       */
      Nullable<LeaseDurationType> LeaseDuration;
      /**
       * Lease state of the file.
       */
      Nullable<Models::LeaseState> LeaseState;
      /**
       * The current lease status of the file.
       */
      Nullable<Models::LeaseStatus> LeaseStatus;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::Delete.
     */
    struct DeleteFileResult final
    {
      /**
       * Indicates if the file was successfully deleted by this operation.
       */
      bool Deleted = true;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::SetHttpHeaders.
     */
    struct SetFilePropertiesResult final
    {
      /**
       * The SMB related properties for the file.
       */
      FileSmbProperties SmbProperties;
      /**
       * The ETag contains a value which represents the version of the file, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the directory was last modified. Any operation that modifies the
       * directory or its properties updates the last modified time. Operations on files do not
       * affect the last modified time of the directory.
       */
      DateTime LastModified;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = bool();
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::SetMetadata.
     */
    struct SetFileMetadataResult final
    {
      /**
       * The ETag contains a value which represents the version of the file, in quotes.
       */
      Azure::ETag ETag;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = bool();
    };
    namespace _detail {
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::FileClient::AcquireLease.
       */
      struct AcquireFileLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally. If the
         * request version is 2011-08-18 or newer, the ETag value will be in quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the file was last modified. Any operation that modifies the
         * file, including an update of the file's metadata or properties, changes the last-modified
         * time of the file.
         */
        DateTime LastModified;
        /**
         * Uniquely identifies a file's lease.
         */
        std::string LeaseId;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::FileClient::ReleaseLease.
       */
      struct ReleaseFileLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally. If the
         * request version is 2011-08-18 or newer, the ETag value will be in quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the file was last modified. Any operation that modifies the
         * file, including an update of the file's metadata or properties, changes the last-modified
         * time of the file.
         */
        DateTime LastModified;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::FileClient::ChangeLease.
       */
      struct ChangeFileLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally. If the
         * request version is 2011-08-18 or newer, the ETag value will be in quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the file was last modified. Any operation that modifies the
         * file, including an update of the file's metadata or properties, changes the last-modified
         * time of the file.
         */
        DateTime LastModified;
        /**
         * Uniquely identifies a file's lease.
         */
        std::string LeaseId;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::FileClient::BreakLease.
       */
      struct BreakFileLeaseResult final
      {
        /**
         * The ETag contains a value that you can use to perform operations conditionally. If the
         * request version is 2011-08-18 or newer, the ETag value will be in quotes.
         */
        Azure::ETag ETag;
        /**
         * Returns the date and time the file was last modified. Any operation that modifies the
         * file, including an update of the file's metadata or properties, changes the last-modified
         * time of the file.
         */
        DateTime LastModified;
      };
    } // namespace _detail
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::UploadRange.
     */
    struct UploadFileRangeResult final
    {
      /**
       * The ETag contains a value which represents the version of the file, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the directory was last modified. Any operation that modifies the
       * share or its properties or metadata updates the last modified time. Operations on files do
       * not affect the last modified time of the share.
       */
      DateTime LastModified;
      /**
       * This header is returned so that the client can check for message content integrity. The
       * value of this header is computed by the File service; it is not necessarily the same value
       * as may have been specified in the request headers.
       */
      ContentHash TransactionalContentHash;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = false;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::UploadRangeFromUri.
     */
    struct UploadFileRangeFromUriResult final
    {
      /**
       * The ETag contains a value which represents the version of the file, in quotes.
       */
      Azure::ETag ETag;
      /**
       * Returns the date and time the directory was last modified. Any operation that modifies the
       * share or its properties or metadata updates the last modified time. Operations on files do
       * not affect the last modified time of the share.
       */
      DateTime LastModified;
      /**
       * This header is returned so that the client can check for message content integrity. The
       * value of this header is computed by the File service; it is not necessarily the same value
       * as may have been specified in the request headers.
       */
      ContentHash TransactionalContentHash;
      /**
       * The value of this header is set to true if the contents of the request are successfully
       * encrypted using the specified algorithm, and false otherwise.
       */
      bool IsServerEncrypted = false;
    };
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::GetRangeList.
     */
    struct GetFileRangeListResult final
    {
      /**
       * Array of Range.
       */
      std::vector<Core::Http::HttpRange> Ranges;
      /**
       * Array of ClearRange.
       */
      std::vector<Core::Http::HttpRange> ClearRanges;
      /**
       * The date/time that the file was last modified. Any operation that modifies the file,
       * including an update of the file's metadata or properties, changes the file's last modified
       * time.
       */
      DateTime LastModified;
      /**
       * The ETag contains a value which represents the version of the file, in quotes.
       */
      Azure::ETag ETag;
      /**
       * The size of the file in bytes.
       */
      int64_t FileSize = int64_t();
    };
    /**
     * @brief Specifies the option to copy file security descriptor from source file or to set it
     * using the value which is defined by the header value of x-ms-file-permission or
     * x-ms-file-permission-key.
     */
    class PermissionCopyMode final {
    public:
      PermissionCopyMode() = default;
      explicit PermissionCopyMode(std::string value) : m_value(std::move(value)) {}
      bool operator==(const PermissionCopyMode& other) const { return m_value == other.m_value; }
      bool operator!=(const PermissionCopyMode& other) const { return !(*this == other); }
      const std::string& ToString() const { return m_value; }
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static PermissionCopyMode Source;
      AZ_STORAGE_FILES_SHARES_DLLEXPORT const static PermissionCopyMode Override;

    private:
      std::string m_value;
    };
    namespace _detail {
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::FileClient::StartCopy.
       */
      struct StartFileCopyResult final
      {
        /**
         * If the copy is completed, contains the ETag of the destination file. If the copy is not
         * complete, contains the ETag of the empty file created at the start of the copy.
         */
        Azure::ETag ETag;
        /**
         * Returns the date/time that the copy operation to the destination file completed.
         */
        DateTime LastModified;
        /**
         * String identifier for this copy operation. Use with Get File or Get File Properties to
         * check the status of this copy operation, or pass to Abort Copy File to abort a pending
         * copy.
         */
        std::string CopyId;
        /**
         * State of the copy operation identified by x-ms-copy-id.
         */
        Models::CopyStatus CopyStatus;
      };
    } // namespace _detail
    /**
     * @brief Response type for #Azure::Storage::Files::Shares::FileClient::AbortCopy.
     */
    struct AbortFileCopyResult final
    {
    };
    namespace _detail {
      /**
       * @brief An enumeration of handles.
       */
      struct ListHandlesResponse final
      {
        /**
         * Array of HandleItem.
         */
        std::vector<HandleItem> HandleList;
        std::string NextMarker;
      };
      /**
       * @brief Response type for #Azure::Storage::Files::Shares::FileClient::ForceCloseHandles.
       */
      struct ForceFileCloseHandlesResult final
      {
        /**
         * A string describing next handle to be closed. It is returned when more handles need to be
         * closed to complete the request.
         */
        Nullable<std::string> ContinuationToken;
        /**
         * Contains count of number of handles closed.
         */
        int32_t NumberOfHandlesClosed = int32_t();
        /**
         * Contains count of number of handles that failed to close.
         */
        int32_t NumberOfHandlesFailedToClose = int32_t();
      };
    } // namespace _detail
  } // namespace Models
  namespace _detail {
    class ServiceClient final {
    public:
      struct SetServicePropertiesOptions final
      {
        Models::ShareServiceProperties ShareServiceProperties;
      };
      static Response<Models::SetServicePropertiesResult> SetProperties(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetServicePropertiesOptions& options,
          const Core::Context& context);
      struct GetServicePropertiesOptions final
      {
      };
      static Response<Models::ShareServiceProperties> GetProperties(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetServicePropertiesOptions& options,
          const Core::Context& context);
      struct ListServiceSharesSegmentOptions final
      {
        Nullable<std::string> Prefix;
        Nullable<std::string> Marker;
        Nullable<int32_t> MaxResults;
        Nullable<Models::ListSharesIncludeFlags> Include;
      };
      static Response<Models::_detail::ListSharesResponse> ListSharesSegment(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ListServiceSharesSegmentOptions& options,
          const Core::Context& context);
    };
    class ShareClient final {
    public:
      struct CreateShareOptions final
      {
        std::map<std::string, std::string> Metadata;
        Nullable<int64_t> Quota;
        Nullable<Models::AccessTier> AccessTier;
      };
      static Response<Models::CreateShareResult> Create(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const CreateShareOptions& options,
          const Core::Context& context);
      struct GetSharePropertiesOptions final
      {
        Nullable<std::string> Sharesnapshot;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::ShareProperties> GetProperties(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetSharePropertiesOptions& options,
          const Core::Context& context);
      struct DeleteShareOptions final
      {
        Nullable<std::string> Sharesnapshot;
        Nullable<Models::DeleteSnapshotsOption> DeleteSnapshots;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::DeleteShareResult> Delete(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const DeleteShareOptions& options,
          const Core::Context& context);
      struct AcquireShareLeaseOptions final
      {
        Nullable<int32_t> Duration;
        Nullable<std::string> ProposedLeaseId;
        Nullable<std::string> Sharesnapshot;
      };
      static Response<Models::_detail::AcquireShareLeaseResult> AcquireLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const AcquireShareLeaseOptions& options,
          const Core::Context& context);
      struct ReleaseShareLeaseOptions final
      {
        std::string LeaseId;
        Nullable<std::string> Sharesnapshot;
      };
      static Response<Models::_detail::ReleaseShareLeaseResult> ReleaseLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ReleaseShareLeaseOptions& options,
          const Core::Context& context);
      struct ChangeShareLeaseOptions final
      {
        std::string LeaseId;
        Nullable<std::string> ProposedLeaseId;
        Nullable<std::string> Sharesnapshot;
      };
      static Response<Models::_detail::ChangeShareLeaseResult> ChangeLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ChangeShareLeaseOptions& options,
          const Core::Context& context);
      struct RenewShareLeaseOptions final
      {
        std::string LeaseId;
        Nullable<std::string> Sharesnapshot;
      };
      static Response<Models::_detail::RenewShareLeaseResult> RenewLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const RenewShareLeaseOptions& options,
          const Core::Context& context);
      struct BreakShareLeaseOptions final
      {
        Nullable<int32_t> BreakPeriod;
        Nullable<std::string> LeaseId;
        Nullable<std::string> Sharesnapshot;
      };
      static Response<Models::_detail::BreakShareLeaseResult> BreakLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const BreakShareLeaseOptions& options,
          const Core::Context& context);
      struct CreateShareSnapshotOptions final
      {
        std::map<std::string, std::string> Metadata;
      };
      static Response<Models::CreateShareSnapshotResult> CreateSnapshot(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const CreateShareSnapshotOptions& options,
          const Core::Context& context);
      struct CreateSharePermissionOptions final
      {
        Models::_detail::SharePermission SharePermission;
      };
      static Response<Models::CreateSharePermissionResult> CreatePermission(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const CreateSharePermissionOptions& options,
          const Core::Context& context);
      struct GetSharePermissionOptions final
      {
        std::string FilePermissionKey;
      };
      static Response<Models::_detail::SharePermission> GetPermission(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetSharePermissionOptions& options,
          const Core::Context& context);
      struct SetSharePropertiesOptions final
      {
        Nullable<int64_t> Quota;
        Nullable<Models::AccessTier> AccessTier;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::SetSharePropertiesResult> SetProperties(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetSharePropertiesOptions& options,
          const Core::Context& context);
      struct SetShareMetadataOptions final
      {
        std::map<std::string, std::string> Metadata;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::SetShareMetadataResult> SetMetadata(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetShareMetadataOptions& options,
          const Core::Context& context);
      struct GetShareAccessPolicyOptions final
      {
        Nullable<std::string> LeaseId;
      };
      static Response<Models::ShareAccessPolicy> GetAccessPolicy(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetShareAccessPolicyOptions& options,
          const Core::Context& context);
      struct SetShareAccessPolicyOptions final
      {
        std::vector<Models::SignedIdentifier> ShareAcl;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::SetShareAccessPolicyResult> SetAccessPolicy(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetShareAccessPolicyOptions& options,
          const Core::Context& context);
      struct GetShareStatisticsOptions final
      {
        Nullable<std::string> LeaseId;
      };
      static Response<Models::ShareStatistics> GetStatistics(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetShareStatisticsOptions& options,
          const Core::Context& context);
    };
    class DirectoryClient final {
    public:
      struct CreateDirectoryOptions final
      {
        std::map<std::string, std::string> Metadata;
        Nullable<std::string> FilePermission;
        Nullable<std::string> FilePermissionKey;
        std::string FileAttributes;
        std::string FileCreationTime;
        std::string FileLastWriteTime;
      };
      static Response<Models::CreateDirectoryResult> Create(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const CreateDirectoryOptions& options,
          const Core::Context& context);
      struct GetDirectoryPropertiesOptions final
      {
        Nullable<std::string> Sharesnapshot;
      };
      static Response<Models::DirectoryProperties> GetProperties(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetDirectoryPropertiesOptions& options,
          const Core::Context& context);
      struct DeleteDirectoryOptions final
      {
      };
      static Response<Models::DeleteDirectoryResult> Delete(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const DeleteDirectoryOptions& options,
          const Core::Context& context);
      struct SetDirectoryPropertiesOptions final
      {
        Nullable<std::string> FilePermission;
        Nullable<std::string> FilePermissionKey;
        std::string FileAttributes;
        std::string FileCreationTime;
        std::string FileLastWriteTime;
      };
      static Response<Models::SetDirectoryPropertiesResult> SetProperties(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetDirectoryPropertiesOptions& options,
          const Core::Context& context);
      struct SetDirectoryMetadataOptions final
      {
        std::map<std::string, std::string> Metadata;
      };
      static Response<Models::SetDirectoryMetadataResult> SetMetadata(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetDirectoryMetadataOptions& options,
          const Core::Context& context);
      struct ListDirectoryFilesAndDirectoriesSegmentOptions final
      {
        Nullable<std::string> Prefix;
        Nullable<std::string> Sharesnapshot;
        Nullable<std::string> Marker;
        Nullable<int32_t> MaxResults;
      };
      static Response<Models::_detail::ListFilesAndDirectoriesSegmentResponse>
      ListFilesAndDirectoriesSegment(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ListDirectoryFilesAndDirectoriesSegmentOptions& options,
          const Core::Context& context);
      struct ListDirectoryHandlesOptions final
      {
        Nullable<std::string> Marker;
        Nullable<int32_t> MaxResults;
        Nullable<std::string> Sharesnapshot;
        Nullable<bool> Recursive;
      };
      static Response<Models::_detail::ListHandlesResponse> ListHandles(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ListDirectoryHandlesOptions& options,
          const Core::Context& context);
      struct ForceDirectoryCloseHandlesOptions final
      {
        Nullable<std::string> Marker;
        Nullable<std::string> Sharesnapshot;
        std::string HandleId;
        Nullable<bool> Recursive;
      };
      static Response<Models::_detail::ForceCloseDirectoryHandlesResult> ForceCloseHandles(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ForceDirectoryCloseHandlesOptions& options,
          const Core::Context& context);
    };
    class FileClient final {
    public:
      struct CreateFileOptions final
      {
        int64_t FileContentLength = int64_t();
        Nullable<std::string> FileContentType;
        Nullable<std::string> FileContentEncoding;
        Nullable<std::string> FileContentLanguage;
        Nullable<std::string> FileCacheControl;
        Nullable<std::vector<uint8_t>> FileContentMD5;
        Nullable<std::string> FileContentDisposition;
        std::map<std::string, std::string> Metadata;
        Nullable<std::string> FilePermission;
        Nullable<std::string> FilePermissionKey;
        std::string FileAttributes;
        std::string FileCreationTime;
        std::string FileLastWriteTime;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::CreateFileResult> Create(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const CreateFileOptions& options,
          const Core::Context& context);
      struct DownloadFileOptions final
      {
        Nullable<std::string> Range;
        Nullable<bool> RangeGetContentMD5;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::DownloadFileResult> Download(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const DownloadFileOptions& options,
          const Core::Context& context);
      struct GetFilePropertiesOptions final
      {
        Nullable<std::string> Sharesnapshot;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::FileProperties> GetProperties(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetFilePropertiesOptions& options,
          const Core::Context& context);
      struct DeleteFileOptions final
      {
        Nullable<std::string> LeaseId;
      };
      static Response<Models::DeleteFileResult> Delete(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const DeleteFileOptions& options,
          const Core::Context& context);
      struct SetFileHttpHeadersOptions final
      {
        Nullable<int64_t> FileContentLength;
        Nullable<std::string> FileContentType;
        Nullable<std::string> FileContentEncoding;
        Nullable<std::string> FileContentLanguage;
        Nullable<std::string> FileCacheControl;
        Nullable<std::vector<uint8_t>> FileContentMD5;
        Nullable<std::string> FileContentDisposition;
        Nullable<std::string> FilePermission;
        Nullable<std::string> FilePermissionKey;
        std::string FileAttributes;
        std::string FileCreationTime;
        std::string FileLastWriteTime;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::SetFilePropertiesResult> SetHttpHeaders(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetFileHttpHeadersOptions& options,
          const Core::Context& context);
      struct SetFileMetadataOptions final
      {
        std::map<std::string, std::string> Metadata;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::SetFileMetadataResult> SetMetadata(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const SetFileMetadataOptions& options,
          const Core::Context& context);
      struct AcquireFileLeaseOptions final
      {
        Nullable<int32_t> Duration;
        Nullable<std::string> ProposedLeaseId;
      };
      static Response<Models::_detail::AcquireFileLeaseResult> AcquireLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const AcquireFileLeaseOptions& options,
          const Core::Context& context);
      struct ReleaseFileLeaseOptions final
      {
        std::string LeaseId;
      };
      static Response<Models::_detail::ReleaseFileLeaseResult> ReleaseLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ReleaseFileLeaseOptions& options,
          const Core::Context& context);
      struct ChangeFileLeaseOptions final
      {
        std::string LeaseId;
        Nullable<std::string> ProposedLeaseId;
      };
      static Response<Models::_detail::ChangeFileLeaseResult> ChangeLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ChangeFileLeaseOptions& options,
          const Core::Context& context);
      struct BreakFileLeaseOptions final
      {
        Nullable<std::string> LeaseId;
      };
      static Response<Models::_detail::BreakFileLeaseResult> BreakLease(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const BreakFileLeaseOptions& options,
          const Core::Context& context);
      struct UploadFileRangeOptions final
      {
        std::string Range;
        std::string FileRangeWrite;
        Nullable<std::vector<uint8_t>> ContentMD5;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::UploadFileRangeResult> UploadRange(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          Core::IO::BodyStream& requestBody,
          const UploadFileRangeOptions& options,
          const Core::Context& context);
      struct UploadFileRangeFromUriOptions final
      {
        std::string Range;
        std::string CopySource;
        Nullable<std::string> SourceRange;
        Nullable<std::vector<uint8_t>> SourceContentCrc64;
        Nullable<std::vector<uint8_t>> SourceIfMatchCrc64;
        Nullable<std::vector<uint8_t>> SourceIfNoneMatchCrc64;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::UploadFileRangeFromUriResult> UploadRangeFromUri(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const UploadFileRangeFromUriOptions& options,
          const Core::Context& context);
      struct GetFileRangeListOptions final
      {
        Nullable<std::string> Sharesnapshot;
        Nullable<std::string> Prevsharesnapshot;
        Nullable<std::string> Range;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::GetFileRangeListResult> GetRangeList(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const GetFileRangeListOptions& options,
          const Core::Context& context);
      struct StartFileCopyOptions final
      {
        std::map<std::string, std::string> Metadata;
        std::string CopySource;
        Nullable<std::string> FilePermission;
        Nullable<std::string> FilePermissionKey;
        Nullable<Models::PermissionCopyMode> FilePermissionCopyMode;
        Nullable<bool> IgnoreReadOnly;
        Nullable<std::string> FileAttributes;
        Nullable<std::string> FileCreationTime;
        Nullable<std::string> FileLastWriteTime;
        Nullable<bool> SetArchiveAttribute;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::_detail::StartFileCopyResult> StartCopy(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const StartFileCopyOptions& options,
          const Core::Context& context);
      struct AbortFileCopyOptions final
      {
        std::string CopyId;
        Nullable<std::string> LeaseId;
      };
      static Response<Models::AbortFileCopyResult> AbortCopy(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const AbortFileCopyOptions& options,
          const Core::Context& context);
      struct ListFileHandlesOptions final
      {
        Nullable<std::string> Marker;
        Nullable<int32_t> MaxResults;
        Nullable<std::string> Sharesnapshot;
      };
      static Response<Models::_detail::ListHandlesResponse> ListHandles(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ListFileHandlesOptions& options,
          const Core::Context& context);
      struct ForceFileCloseHandlesOptions final
      {
        Nullable<std::string> Marker;
        Nullable<std::string> Sharesnapshot;
        std::string HandleId;
      };
      static Response<Models::_detail::ForceFileCloseHandlesResult> ForceCloseHandles(
          Core::Http::_internal::HttpPipeline& pipeline,
          const Core::Url& url,
          const ForceFileCloseHandlesOptions& options,
          const Core::Context& context);
    };
  } // namespace _detail
}}}} // namespace Azure::Storage::Files::Shares