#ifndef TOOLS_GN_BUNDLE_DATA_H_
#define TOOLS_GN_BUNDLE_DATA_H_
#include <map>
#include <string>
#include <vector>
#include "gn/action_values.h"
#include "gn/bundle_file_rule.h"
#include "gn/source_dir.h"
#include "gn/source_file.h"
#include "gn/substitution_list.h"
#include "gn/unique_vector.h"
class LabelPattern;
class OutputFile;
class Settings;
class Target;
class BundleData {
public:
using UniqueTargets = UniqueVector<const Target*>;
using SourceFiles = std::vector<SourceFile>;
using OutputFiles = std::vector<OutputFile>;
using BundleFileRules = std::vector<BundleFileRule>;
BundleData();
~BundleData();
static SourceFile GetAssetsCatalogDirectory(const SourceFile& source);
void AddBundleData(const Target* target, bool is_create_bundle);
void OnTargetResolved(Target* owning_target);
void GetSourceFiles(SourceFiles* sources) const;
bool GetOutputFiles(const Settings* settings,
const Target* target,
OutputFiles* outputs,
Err* err) const;
bool GetOutputsAsSourceFiles(const Settings* settings,
const Target* target,
SourceFiles* outputs_as_source,
Err* err) const;
SourceFile GetCompiledAssetCatalogPath() const;
SourceFile GetBundleRootDirOutput(const Settings* settings) const;
SourceDir GetBundleRootDirOutputAsDir(const Settings* settings) const;
SourceDir GetBundleDir(const Settings* settings) const;
SourceFiles& assets_catalog_sources() { return assets_catalog_sources_; }
const SourceFiles& assets_catalog_sources() const {
return assets_catalog_sources_;
}
std::vector<const Target*> assets_catalog_deps() const {
return assets_catalog_deps_;
}
BundleFileRules& file_rules() { return file_rules_; }
const BundleFileRules& file_rules() const { return file_rules_; }
SourceDir& root_dir() { return root_dir_; }
const SourceDir& root_dir() const { return root_dir_; }
SourceDir& contents_dir() { return contents_dir_; }
const SourceDir& contents_dir() const { return contents_dir_; }
SourceDir& resources_dir() { return resources_dir_; }
const SourceDir& resources_dir() const { return resources_dir_; }
SourceDir& executable_dir() { return executable_dir_; }
const SourceDir& executable_dir() const { return executable_dir_; }
std::map<std::string, std::string>& xcode_extra_attributes() {
return xcode_extra_attributes_;
}
const std::map<std::string, std::string>& xcode_extra_attributes() const {
return xcode_extra_attributes_;
}
bool transparent() const { return transparent_; }
void set_transparent(bool value) { transparent_ = value; }
std::string& product_type() { return product_type_; }
const std::string& product_type() const { return product_type_; }
std::string& xcode_test_application_name() {
return xcode_test_application_name_;
}
const std::string& xcode_test_application_name() const {
return xcode_test_application_name_;
}
void set_partial_info_plist(const SourceFile& partial_info_plist) {
partial_info_plist_ = partial_info_plist;
}
const SourceFile& partial_info_plist() const { return partial_info_plist_; }
void set_post_processing_script(const SourceFile& script_file) {
post_processing_script_ = script_file;
}
const SourceFile& post_processing_script() const {
return post_processing_script_;
}
void set_post_processing_manifest(const SourceFile& manifest_file) {
post_processing_manifest_ = manifest_file;
}
const SourceFile& post_processing_manifest() const {
return post_processing_manifest_;
}
std::vector<SourceFile>& post_processing_sources() {
return post_processing_sources_;
}
const std::vector<SourceFile>& post_processing_sources() const {
return post_processing_sources_;
}
SubstitutionList& post_processing_outputs() {
return post_processing_outputs_;
}
const SubstitutionList& post_processing_outputs() const {
return post_processing_outputs_;
}
SubstitutionList& post_processing_args() { return post_processing_args_; }
const SubstitutionList& post_processing_args() const {
return post_processing_args_;
}
std::vector<LabelPattern>& bundle_deps_filter() {
return bundle_deps_filter_;
}
const std::vector<LabelPattern>& bundle_deps_filter() const {
return bundle_deps_filter_;
}
SubstitutionList& xcasset_compiler_flags() { return xcasset_compiler_flags_; }
const SubstitutionList& xcasset_compiler_flags() const {
return xcasset_compiler_flags_;
}
const UniqueTargets& bundle_deps() const { return bundle_deps_; }
const UniqueTargets& forwarded_bundle_deps() const {
return forwarded_bundle_deps_;
}
bool is_application() const {
return product_type_ == "com.apple.product-type.application";
}
bool is_framework() const {
return product_type_ == "com.apple.product-type.framework";
}
private:
SourceFiles assets_catalog_sources_;
std::vector<const Target*> assets_catalog_deps_;
BundleFileRules file_rules_;
UniqueTargets bundle_deps_;
UniqueTargets forwarded_bundle_deps_;
std::vector<LabelPattern> bundle_deps_filter_;
SourceDir root_dir_;
SourceDir contents_dir_;
SourceDir resources_dir_;
SourceDir executable_dir_;
std::map<std::string, std::string> xcode_extra_attributes_;
std::string product_type_;
bool transparent_ = false;
std::string xcode_test_application_name_;
SourceFile partial_info_plist_;
SourceFile post_processing_script_;
SourceFile post_processing_manifest_;
std::vector<SourceFile> post_processing_sources_;
SubstitutionList post_processing_outputs_;
SubstitutionList post_processing_args_;
SubstitutionList xcasset_compiler_flags_;
BundleData(const BundleData&) = delete;
BundleData& operator=(const BundleData&) = delete;
};
#endif