/// <summary>Initializes a new instance of the <see cref="MvcHalJsonMvcOptionsSetup"/> class.</summary>
 /// <param name="jsonOptions">The application's MVC JSON configuration.</param>
 /// <param name="charPool">A pool of <see cref="char"/>.</param>
 /// <param name="halRepository">The application's HAL+JSON repository.</param>
 public MvcHalJsonMvcOptionsSetup(
     IOptions <MvcNewtonsoftJsonOptions> jsonOptions,
     ArrayPool <char> charPool,
     IHalRepository halRepository)
 {
     _jsonOptions   = jsonOptions.Value;
     _charPool      = charPool;
     _halRepository = halRepository;
 }
        /// <summary>Configures the options.</summary>
        /// <param name="options">The application's MVC JSON configuration.</param>
        /// <param name="serializerSettings">The application's JSON serialization settings.</param>
        /// <param name="charPool">A pool of <see cref="char"/>.</param>
        /// <param name="halRepository">The application's HAL+JSON repository.</param>
        static void ConfigureMvc(
            [NotNull] MvcOptions options,
            [NotNull] JsonSerializerSettings serializerSettings,
            [NotNull] ArrayPool <char> charPool,
            [NotNull] IHalRepository halRepository)
        {
            var outputFormatter = new HalJsonOutputFormatter(serializerSettings, charPool, halRepository);

            options.OutputFormatters.Add(outputFormatter);
        }
        /// <summary>Initializes a new instance of the <see cref="HalJsonOutputFormatter"/> class.</summary>
        /// <param name="serializerSettings">
        /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
        /// (<see cref="MvcJsonOptions.SerializerSettings"/>) or an instance
        /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
        /// </param>
        /// <param name="charPool">The <see cref="ArrayPool{T}"/>.</param>
        /// <param name="halRepository">The application's HAL+JSON repository.</param>
        /// <exception cref="ArgumentNullException"><paramref name="serializerSettings"/> is <see langword="null"/>.</exception>
        /// <exception cref="ArgumentNullException"><paramref name="charPool"/> is <see langword="null"/>.</exception>
        /// <exception cref="ArgumentNullException"><paramref name="halRepository"/> is <see langword="null"/>.</exception>
        public HalJsonOutputFormatter(
            [NotNull] JsonSerializerSettings serializerSettings,
            [NotNull] ArrayPool <char> charPool,
            [NotNull] IHalRepository halRepository)
            : base(serializerSettings, charPool)
        {
            _halRepository = halRepository ?? throw new ArgumentNullException(nameof(halRepository));

            SupportedMediaTypes.Clear();
            SupportedMediaTypes.Add("application/hal+json");
        }
 /// <summary>Initializes a new instance of the <see cref="MvcHalJsonMvcOptionsSetup"/> class.</summary>
 /// <param name="jsonOptions">The application's MVC JSON configuration.</param>
 /// <param name="charPool">A pool of <see cref="char"/>.</param>
 /// <param name="halRepository">The application's HAL+JSON repository.</param>
 public MvcHalJsonMvcOptionsSetup(
     IOptions <MvcJsonOptions> jsonOptions,
     ArrayPool <char> charPool,
     IHalRepository halRepository)
     : base(options => ConfigureMvc(
                options,
                jsonOptions.Value.SerializerSettings,
                charPool,
                halRepository))
 {
 }
        /// <summary>Initializes a new instance of the <see cref="HalJsonOutputFormatter"/> class.</summary>
        /// <param name="serializerSettings">
        /// The <see cref="JsonSerializerSettings"/>. Should be either the application-wide settings
        /// (<see cref="MvcNewtonsoftJsonOptions.SerializerSettings"/>) or an instance
        /// <see cref="JsonSerializerSettingsProvider.CreateSerializerSettings"/> initially returned.
        /// </param>
        /// <param name="charPool">The <see cref="ArrayPool{T}"/>.</param>
        /// <param name="mvcOptions">The application's option for configuring MVC.</param>
        /// <param name="halRepository">The application's HAL+JSON repository.</param>
        public HalJsonOutputFormatter(
            JsonSerializerSettings serializerSettings,
            ArrayPool <char> charPool,
            MvcOptions mvcOptions,
            IHalRepository halRepository)
            : base(serializerSettings, charPool, mvcOptions)
        {
            _halRepository = halRepository;

            SupportedMediaTypes.Clear();
            SupportedMediaTypes.Add("application/hal+json");
        }