// Copyright 2020 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

/// A set of allowed XTypes
class XTypeGroup {
  /// Creates a new group with the given label and file extensions.
  ///
  /// A group with none of the type options provided indicates that any type is
  /// allowed.
  XTypeGroup({
    this.label,
    this.extensions,
    this.mimeTypes,
    this.macUTIs,
    this.webWildCards,
  });

  /// The 'name' or reference to this group of types
  final String? label;

  /// The extensions for this group
  final List<String>? extensions;

  /// The MIME types for this group
  final List<String>? mimeTypes;

  /// The UTIs for this group
  final List<String>? macUTIs;

  /// The web wild cards for this group (ex: image/*, video/*)
  final List<String>? webWildCards;

  /// Converts this object into a JSON formatted object
  Map<String, dynamic> toJSON() {
    return <String, dynamic>{
      'label': label,
      'extensions': extensions,
      'mimeTypes': mimeTypes,
      'macUTIs': macUTIs,
      'webWildCards': webWildCards,
    };
  }
}
