NAH 1.0.6
Native Application Host - Library API Reference
Loading...
Searching...
No Matches
manifest_builder.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <cstdint>
4#include <string>
5#include <vector>
6
7namespace nah {
8
9// ============================================================================
10// Manifest Builder (per SPEC L1569-L1596)
11// ============================================================================
12
14public:
15 ManifestBuilder& id(const std::string& value);
16 ManifestBuilder& version(const std::string& value);
17 ManifestBuilder& nak_id(const std::string& value);
18 ManifestBuilder& nak_version_req(const std::string& value);
19 ManifestBuilder& entrypoint(const std::string& value);
20 ManifestBuilder& entrypoint_arg(const std::string& value);
21 ManifestBuilder& env(const std::string& key, const std::string& value);
22 ManifestBuilder& lib_dir(const std::string& value);
23 ManifestBuilder& asset_dir(const std::string& value);
24 ManifestBuilder& asset_export(const std::string& id, const std::string& path,
25 const std::string& type = "");
26 ManifestBuilder& filesystem_permission(const std::string& value);
27 ManifestBuilder& network_permission(const std::string& value);
28 ManifestBuilder& description(const std::string& value);
29 ManifestBuilder& author(const std::string& value);
30 ManifestBuilder& license(const std::string& value);
31 ManifestBuilder& homepage(const std::string& value);
32
33 // Build the manifest blob (header + TLV payload)
34 std::vector<uint8_t> build() const;
35
36private:
37 std::string id_;
38 std::string version_;
39 std::string nak_id_;
40 std::string nak_version_req_;
41 std::string entrypoint_;
42 std::vector<std::string> entrypoint_args_;
43 std::vector<std::string> env_vars_;
44 std::vector<std::string> lib_dirs_;
45 std::vector<std::string> asset_dirs_;
46 std::vector<std::string> asset_exports_;
47 std::vector<std::string> filesystem_permissions_;
48 std::vector<std::string> network_permissions_;
49 std::string description_;
50 std::string author_;
51 std::string license_;
52 std::string homepage_;
53};
54
55// Factory function for fluent building
57 return ManifestBuilder();
58}
59
60} // namespace nah
61
62// ============================================================================
63// Platform-Specific Section Attributes (per SPEC L1601-L1627)
64// ============================================================================
65
66#if defined(__APPLE__)
67 #define NAH_MANIFEST_SECTION \
68 __attribute__((used)) \
69 __attribute__((section("__NAH,__manifest"))) \
70 __attribute__((aligned(16)))
71#elif defined(__linux__) || defined(__unix__)
72 #define NAH_MANIFEST_SECTION \
73 __attribute__((used)) \
74 __attribute__((section(".nah_manifest"))) \
75 __attribute__((aligned(16)))
76#elif defined(_WIN32)
77 #pragma section(".nah", read)
78 #define NAH_MANIFEST_SECTION \
79 __declspec(allocate(".nah"))
80#else
81 #define NAH_MANIFEST_SECTION
82#endif
83
84// ============================================================================
85// NAH_APP_MANIFEST Macro (per SPEC L1569-L1596)
86// ============================================================================
87
88// Helper to define manifest data at compile time
89#define NAH_APP_MANIFEST(builder) \
90 namespace { \
91 static const auto _nah_manifest_data = (builder); \
92 NAH_MANIFEST_SECTION \
93 static const uint8_t _nah_manifest[sizeof(_nah_manifest_data)] = {}; \
94 } \
95 namespace nah { \
96 namespace detail { \
97 [[gnu::constructor]] \
98 void _init_manifest() { \
99 auto data = (builder); \
100 std::memcpy(const_cast<uint8_t*>(_nah_manifest), data.data(), data.size()); \
101 } \
102 } \
103 }
104
105// Simpler version that embeds pre-built manifest bytes
106#define NAH_EMBED_MANIFEST(bytes, size) \
107 NAH_MANIFEST_SECTION \
108 static const uint8_t _nah_manifest_data[size] = bytes
ManifestBuilder & author(const std::string &value)
ManifestBuilder & id(const std::string &value)
ManifestBuilder & filesystem_permission(const std::string &value)
ManifestBuilder & entrypoint_arg(const std::string &value)
ManifestBuilder & network_permission(const std::string &value)
ManifestBuilder & entrypoint(const std::string &value)
ManifestBuilder & asset_export(const std::string &id, const std::string &path, const std::string &type="")
ManifestBuilder & license(const std::string &value)
ManifestBuilder & asset_dir(const std::string &value)
std::vector< uint8_t > build() const
ManifestBuilder & lib_dir(const std::string &value)
ManifestBuilder & version(const std::string &value)
ManifestBuilder & nak_version_req(const std::string &value)
ManifestBuilder & env(const std::string &key, const std::string &value)
ManifestBuilder & nak_id(const std::string &value)
ManifestBuilder & description(const std::string &value)
ManifestBuilder & homepage(const std::string &value)
ManifestBuilder manifest()