From d2fd3b8f1f1cdee50a6bcaa6060c3b4864f7fb7e Mon Sep 17 00:00:00 2001 From: Alexander Bock Date: Wed, 17 Jun 2020 11:12:01 +0200 Subject: [PATCH] Include helper assets and base assets explicitly Add a new function to export profile struct to module text --- data/assets/apollo8.profile | 11 +- data/assets/apollo_sites.profile | 19 ++- data/assets/dawn.profile | 11 +- data/assets/default.profile | 9 +- data/assets/default_full.profile | 19 ++- data/assets/gaia.profile | 17 ++- data/assets/insight.profile | 7 +- data/assets/juno.profile | 7 +- data/assets/messenger.profile | 7 +- data/assets/newhorizons.profile | 9 +- data/assets/osirisrex.profile | 9 +- data/assets/rosetta.profile | 9 +- data/assets/touch.profile | 9 +- data/assets/util/scene_helper.asset | 1 - data/assets/voyager.profile | 21 +-- include/openspace/scene/profilefile.h | 6 +- src/scene/profile.cpp | 28 +--- src/scene/profilefile.cpp | 190 ++++++++++++++++++++++---- 18 files changed, 295 insertions(+), 94 deletions(-) diff --git a/data/assets/apollo8.profile b/data/assets/apollo8.profile index 13638ccb1d..2c50610c09 100644 --- a/data/assets/apollo8.profile +++ b/data/assets/apollo8.profile @@ -2,9 +2,14 @@ 1.0 #Asset -scene/solarsystem/planets/earth/moon/moon require -scene/solarsystem/missions/apollo/8/apollo8 require -scene/solarsystem/planets/earth/earth require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/planets/earth/moon/moon require +scene/solarsystem/missions/apollo/8/apollo8 require +scene/solarsystem/planets/earth/earth require #Property setPropertyValueSingle NavigationHandler.OrbitalNavigator.MinimumAllowedDistance 0.000000 diff --git a/data/assets/apollo_sites.profile b/data/assets/apollo_sites.profile index 9cd537a7d0..5b1bcc786d 100644 --- a/data/assets/apollo_sites.profile +++ b/data/assets/apollo_sites.profile @@ -2,13 +2,18 @@ 1.0 #Asset -scene/solarsystem/planets/earth/moon/moon require -scene/solarsystem/missions/apollo/8/apollo8 require -scene/solarsystem/missions/apollo/11/apollo11 require -scene/solarsystem/missions/apollo/17/lem require -scene/solarsystem/missions/apollo/apollo_globebrowsing require -scene/solarsystem/missions/apollo/11/lem_flipbook require -scene/solarsystem/missions/apollo/insignias_map require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/planets/earth/moon/moon require +scene/solarsystem/missions/apollo/8/apollo8 require +scene/solarsystem/missions/apollo/11/apollo11 require +scene/solarsystem/missions/apollo/17/lem require +scene/solarsystem/missions/apollo/apollo_globebrowsing require +scene/solarsystem/missions/apollo/11/lem_flipbook require +scene/solarsystem/missions/apollo/insignias_map require #Property setPropertyValueSingle Scene.Moon.Renderable.Layers.ColorLayers.A17_travmap.BlendMode 0 diff --git a/data/assets/dawn.profile b/data/assets/dawn.profile index f94d2a325a..603ad0d504 100644 --- a/data/assets/dawn.profile +++ b/data/assets/dawn.profile @@ -2,9 +2,14 @@ 1.0 #Asset -scene/solarsystem/missions/dawn/ceres require -scene/solarsystem/missions/dawn/dawn require -scene/solarsystem/missions/dawn/vesta require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/missions/dawn/ceres require +scene/solarsystem/missions/dawn/dawn require +scene/solarsystem/missions/dawn/vesta require #Time absolute 2011 AUG 06 00:00:00 diff --git a/data/assets/default.profile b/data/assets/default.profile index 6f4a41d1b0..33831bef7c 100644 --- a/data/assets/default.profile +++ b/data/assets/default.profile @@ -2,8 +2,13 @@ 1.0 #Asset -scene/solarsystem/planets/earth/earth require -scene/solarsystem/planets/earth/satellites/satellites require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/planets/earth/earth require +scene/solarsystem/planets/earth/satellites/satellites require #Property setPropertyValue {earth_satellites}.Renderable.Enabled false diff --git a/data/assets/default_full.profile b/data/assets/default_full.profile index 9e98477827..76721f3a73 100644 --- a/data/assets/default_full.profile +++ b/data/assets/default_full.profile @@ -2,13 +2,18 @@ 1.0 #Asset -scene/solarsystem/planets/earth/earth require -scene/solarsystem/planets/jupiter/minor_moons require -scene/solarsystem/planets/saturn/minor_moons require -scene/solarsystem/planets/uranus/minor_moons require -scene/solarsystem/planets/neptune/inner_moons require -scene/solarsystem/planets/neptune/irregular_prograde_moons require -scene/solarsystem/planets/neptune/irregular_retrograde_moons require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/planets/earth/earth require +scene/solarsystem/planets/jupiter/minor_moons require +scene/solarsystem/planets/saturn/minor_moons require +scene/solarsystem/planets/uranus/minor_moons require +scene/solarsystem/planets/neptune/inner_moons require +scene/solarsystem/planets/neptune/irregular_prograde_moons require +scene/solarsystem/planets/neptune/irregular_retrograde_moons require #Time relative -1d diff --git a/data/assets/gaia.profile b/data/assets/gaia.profile index 922ccc15b4..54e49d9593 100644 --- a/data/assets/gaia.profile +++ b/data/assets/gaia.profile @@ -5,12 +5,17 @@ Gaia openspace.printFatal('Could not load scene due to missing module "gaia"') #Asset -scene/solarsystem/planets/earth/earth require -scene/milkyway/gaia/gaiastars require -scene/milkyway/gaia/apogee require -scene/milkyway/gaia/galah require -scene/solarsystem/missions/gaia/gaia require -scene/solarsystem/missions/gaia/trail require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/planets/earth/earth require +scene/milkyway/gaia/gaiastars require +scene/milkyway/gaia/apogee require +scene/milkyway/gaia/galah require +scene/solarsystem/missions/gaia/gaia require +scene/solarsystem/missions/gaia/trail require #Property setPropertyValueSingle Scene.Stars.Renderable.Enabled false diff --git a/data/assets/insight.profile b/data/assets/insight.profile index cc5be21b46..7b30dba282 100644 --- a/data/assets/insight.profile +++ b/data/assets/insight.profile @@ -2,7 +2,12 @@ 1.0 #Asset -scene/solarsystem/missions/insight/edl require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/missions/insight/edl require #Property setPropertyValueSingle Scene.PlutoBarycenterTrail.Renderable.Enabled false diff --git a/data/assets/juno.profile b/data/assets/juno.profile index c17b10c283..3b38739df0 100644 --- a/data/assets/juno.profile +++ b/data/assets/juno.profile @@ -2,7 +2,12 @@ 1.0 #Asset -scene/solarsystem/missions/juno/juno require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/missions/juno/juno require #Keybinding 1 Setting the simulation speed to 1 seconds per realtime second Set sim speed 1 /Simulation Speed false "openspace.time.interpolateDeltaTime(1)" diff --git a/data/assets/messenger.profile b/data/assets/messenger.profile index 740cc62cc3..3d268995e7 100644 --- a/data/assets/messenger.profile +++ b/data/assets/messenger.profile @@ -5,7 +5,12 @@ Volume asset.require('scene/solarsystem/missions/messenger/mercurymagnetosphere') openspace.printWarning("Volume module is not loaded, skipping asset: mercurymagnetosphere") #Asset -scene/solarsystem/missions/messenger/messengerSC require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/missions/messenger/messengerSC require #Keybinding 1 Setting the simulation speed to 1 seconds per realtime second Set sim speed 1 /Simulation Speed false "openspace.time.interpolateDeltaTime(1)" diff --git a/data/assets/newhorizons.profile b/data/assets/newhorizons.profile index 400a2fde81..1b96e05c7b 100644 --- a/data/assets/newhorizons.profile +++ b/data/assets/newhorizons.profile @@ -2,8 +2,13 @@ 1.0 #Asset -scene/solarsystem/missions/newhorizons/newhorizons require -scene/solarsystem/missions/newhorizons/model require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/missions/newhorizons/newhorizons require +scene/solarsystem/missions/newhorizons/model require #Property setPropertyValueSingle NavigationHandler.OrbitalNavigator.FollowAnchorNodeRotationDistance 20.000000 diff --git a/data/assets/osirisrex.profile b/data/assets/osirisrex.profile index 099678c382..8077989134 100644 --- a/data/assets/osirisrex.profile +++ b/data/assets/osirisrex.profile @@ -2,8 +2,13 @@ 1.0 #Asset -scene/solarsystem/missions/osirisrex/model require -scene/solarsystem/missions/osirisrex/osirisrex require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/missions/osirisrex/model require +scene/solarsystem/missions/osirisrex/osirisrex require #Property setPropertyValueSingle NavigationHandler.OrbitalNavigator.FollowAnchorNodeRotationDistance 20.000000 diff --git a/data/assets/rosetta.profile b/data/assets/rosetta.profile index a7f2b3bdd4..206e3b0a1e 100644 --- a/data/assets/rosetta.profile +++ b/data/assets/rosetta.profile @@ -5,8 +5,13 @@ Volume asset.require('scene/solarsystem/missions/messenger/mercurymagnetosphere') openspace.printWarning("Volume module is not loaded, skipping asset: mercurymagnetosphere") #Asset -scene/solarsystem/missions/rosetta/67p require -scene/solarsystem/missions/rosetta/rosetta require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/missions/rosetta/67p require +scene/solarsystem/missions/rosetta/rosetta require #Property setPropertyValue Scene.67P.Renderable.PerformShading false diff --git a/data/assets/touch.profile b/data/assets/touch.profile index a770c1ceb6..f296c95fc3 100644 --- a/data/assets/touch.profile +++ b/data/assets/touch.profile @@ -5,8 +5,13 @@ Touch local webGui = asset.require('util/webgui'); webGui.setCefRoute("ontouch") openspace.printFatal('Could not load scene due to missing module "touch"') #Asset -scene/solarsystem/planets/earth/earth require -util/webgui require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/planets/earth/earth require +util/webgui require #Property setPropertyValueSingle Scene.Pluto.Renderable.Enabled false diff --git a/data/assets/util/scene_helper.asset b/data/assets/util/scene_helper.asset index 579af633d8..9e7a87cc3c 100644 --- a/data/assets/util/scene_helper.asset +++ b/data/assets/util/scene_helper.asset @@ -9,7 +9,6 @@ local bindKeys = function(t, ignoreWarning) local currentKey = openspace.getKeyBinding(k.Key) if (next(currentKey) ~= nil) and (not ignoreWarning) then - openspace.printWarning('New keybind for "' .. k.Key .. '" is added, but a previous keybind already existed. If you want to silence this warning, pass "true", to this call to bindKeys') end diff --git a/data/assets/voyager.profile b/data/assets/voyager.profile index a3e6401223..c2f50a2acb 100644 --- a/data/assets/voyager.profile +++ b/data/assets/voyager.profile @@ -2,14 +2,19 @@ 1.0 #Asset -scene/solarsystem/planets/jupiter/minor_moons require -scene/solarsystem/planets/saturn/minor_moons require -scene/solarsystem/planets/uranus/minor_moons require -scene/solarsystem/planets/neptune/inner_moons require -scene/solarsystem/planets/neptune/irregular_prograde_moons require -scene/solarsystem/planets/neptune/irregular_retrograde_moons require -scene/solarsystem/missions/voyager/voyager1 require -scene/solarsystem/missions/voyager/voyager2 require +util/asset_helper require assetHelper +util/property_helper require propertyHelper +util/scene_helper require sceneHelper +util/renderable_helper require renderableHelper +base require +scene/solarsystem/planets/jupiter/minor_moons require +scene/solarsystem/planets/saturn/minor_moons require +scene/solarsystem/planets/uranus/minor_moons require +scene/solarsystem/planets/neptune/inner_moons require +scene/solarsystem/planets/neptune/irregular_prograde_moons require +scene/solarsystem/planets/neptune/irregular_retrograde_moons require +scene/solarsystem/missions/voyager/voyager1 require +scene/solarsystem/missions/voyager/voyager2 require #Keybinding 1 Setting the simulation speed to 1 seconds per realtime second Set sim speed 1 /Simulation Speed false "openspace.time.interpolateDeltaTime(1)" diff --git a/include/openspace/scene/profilefile.h b/include/openspace/scene/profilefile.h index 026c45e8fa..753433ec1c 100644 --- a/include/openspace/scene/profilefile.h +++ b/include/openspace/scene/profilefile.h @@ -46,7 +46,7 @@ namespace scripting { struct LuaLibrary; } const size_t timeLinesExpected = 1; const size_t cameraLinesExpected = 1; const size_t moduleFieldsExpected = 3; -const size_t assetFieldsExpected = 2; +const size_t assetFieldsExpected = 3; const size_t propertyFieldsExpected = 3; const size_t keybindingFieldsExpected = 6; const size_t timeFieldsExpected = 2; @@ -107,6 +107,7 @@ struct ProfileStruct { std::string path; Type type; + std::string name; }; std::vector assets; @@ -168,6 +169,9 @@ struct ProfileStruct { }; std::string serialize(const ProfileStruct& ps); +ProfileStruct deserialize(const std::string& filename); + +std::string convertToSceneFile(const ProfileStruct& ps); class ProfileFile { public: diff --git a/src/scene/profile.cpp b/src/scene/profile.cpp index bde1d7291b..16d8c703d2 100644 --- a/src/scene/profile.cpp +++ b/src/scene/profile.cpp @@ -360,22 +360,7 @@ void Profile::convertToSceneFile(const std::string& inProfilePath, } std::string Profile::convertToScene(ProfileFile& pf) { - ZoneScoped - - std::string result; - - result += convertToScene_modules(pf) + "\n"; - result += convertToScene_assets(pf) + "\n"; - result += convertToScene_keybindings(pf) + "\n"; - result += "asset.onInitialize(function ()\n"; - result += convertToScene_time(pf) + "\n"; - result += " sceneHelper.bindKeys(Keybindings)\n\n"; - result += convertToScene_markNodes(pf) + "\n"; - result += convertToScene_properties(pf) + "\n"; - result += convertToScene_camera(pf); - result += "end)\n"; - - return result; + return openspace::convertToSceneFile(pf.profile); } std::string Profile::convertToScene_modules(ProfileFile& pf) { @@ -409,12 +394,6 @@ std::string Profile::convertToScene_assets(ProfileFile& pf) { std::string result; std::string assetR; - result += "asset.require(\"base\");\n"; - result += "local assetHelper = asset.require(\"util/asset_helper\")\n"; - result += "local propertyHelper = asset.require(\"util/property_helper\")\n"; - result += "local sceneHelper = asset.require(\"util/scene_helper\")\n"; - result += "local renderableHelper = asset.require(\"util/renderable_helper\")\n"; - for (size_t i = 0; i < pf.assets().size(); ++i) { std::vector fields = ghoul::tokenizeString(pf.assets()[i], '\t'); @@ -434,7 +413,12 @@ std::string Profile::convertToScene_assets(ProfileFile& pf) { ); throw ghoul::RuntimeError(err); } + + if (!fields[2].empty()) { + result += fmt::format("local {} = ", fields[2]); + } result += fmt::format("asset.{}(\"{}\")\n", assetR, fields[assetFieldName]); + } return result; } diff --git a/src/scene/profilefile.cpp b/src/scene/profilefile.cpp index e36fc8b65d..95896ed6b5 100644 --- a/src/scene/profilefile.cpp +++ b/src/scene/profilefile.cpp @@ -123,28 +123,31 @@ std::string serialize(const ProfileStruct& ps) { } output += fmt::format("\n{}\n", headerCamera); - output += std::visit(overloaded{ - [](const ProfileStruct::CameraNavState& camera) { - return fmt::format( - "{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n", - ProfileStruct::CameraNavState::Type, - camera.anchor, camera.aim, camera.referenceFrame, camera.position, - camera.up, camera.yaw, camera.pitch - ); - }, - [](const ProfileStruct::CameraGoToGeo& camera) { - std::string altitude; - if (camera.altitude.has_value()) { - altitude = std::to_string(*camera.altitude); - } + output += std::visit( + overloaded { + [](const ProfileStruct::CameraNavState& camera) { + return fmt::format( + "{}\t{}\t{}\t{}\t{}\t{}\t{}\t{}\n", + ProfileStruct::CameraNavState::Type, + camera.anchor, camera.aim, camera.referenceFrame, camera.position, + camera.up, camera.yaw, camera.pitch + ); + }, + [](const ProfileStruct::CameraGoToGeo& camera) { + std::string altitude; + if (camera.altitude.has_value()) { + altitude = std::to_string(*camera.altitude); + } - return fmt::format( - "{}\t{}\t{}\t{}\t{}\n", - ProfileStruct::CameraGoToGeo::Type, - camera.anchor, camera.latitude, camera.longitude, altitude - ); - } - }, ps.camera); + return fmt::format( + "{}\t{}\t{}\t{}\t{}\n", + ProfileStruct::CameraGoToGeo::Type, + camera.anchor, camera.latitude, camera.longitude, altitude + ); + } + }, + ps.camera + ); output += fmt::format("\n{}\n", headerMarkNodes); for (const std::string& n : ps.markNodes) { @@ -154,6 +157,145 @@ std::string serialize(const ProfileStruct& ps) { return output; } +ProfileStruct deserialize(const std::string& filename) { + return ProfileStruct(); +} + +std::string convertToSceneFile(const ProfileStruct& ps) { + ZoneScoped + + std::string output; + + // Modules + for (const ProfileStruct::Module& m : ps.modules) { + output += fmt::format( + "if openspace.modules.isLoaded(\"{}\") then {} else {} end\n", + m.name, m.loadedInstruction, m.notLoadedInstruction + ); + } + + // Assets + for (const ProfileStruct::Asset& a : ps.assets) { + if (!a.name.empty()) { + output += fmt::format("local {} = ", a.name); + } + std::string type = [](ProfileStruct::Asset::Type t) { + switch (t) { + case ProfileStruct::Asset::Type::Request: return "request"; + case ProfileStruct::Asset::Type::Require: return "require"; + default: throw ghoul::MissingCaseException(); + } + }(a.type); + + output += fmt::format("asset.{}(\"{}\");\n", type, a.path); + } + + output += "asset.onInitialize(function()\n"; + // Keybindings + for (const ProfileStruct::Keybinding& k : ps.keybindings) { + const std::string name = k.name.empty() ? k.key : k.name; + output += fmt::format( + k.isLocal ? + "openspace.bindKeyLocal(\"{}\", {}, [[{}]], [[{}]], [[{}]]);\n" : + "openspace.bindKey(\"{}\", {}, [[{}]], [[{}]], [[{}]]);\n", + k.key, k.script, k.documentation, k.name.empty() ? k.key : k.name, k.guiPath + ); + } + + // Time + switch (ps.time.type) { + case ProfileStruct::Time::Type::Absolute: + output += fmt::format("openspace.time.setTime(\"{}\")\n", ps.time.time); + break; + case ProfileStruct::Time::Type::Relative: + output += "local now = openspace.time.currentWallTime();\n"; + output += fmt::format( + "local prev = openspace.time.advancedTime(now, \"{}\");\n", ps.time.time + ); + output += "openspace.time.setTime(prev);\n"; + default: + throw ghoul::MissingCaseException(); + } + + // Mark Nodes + { + std::string nodes; + for (const std::string& n : ps.markNodes) { + nodes += fmt::format("[[ {} ]],", n); + } + output += fmt::format("openspace.markInterestingNodes({{ {} }});\n", nodes); + } + + // Properties + for (const ProfileStruct::Property& p : ps.properties) { + constexpr const char* regular = "openspace.setPropertyValue(\"{}\", {});\n"; + constexpr const char* single = "openspace.setPropertyValueSingle(\"{}\", {});\n"; + + switch (p.setType) { + case ProfileStruct::Property::SetType::SetPropertyValue: + output += fmt::format( + "openspace.setPropertyValue(\"{}\", {});\n", + p.name, p.value + ); + break; + case ProfileStruct::Property::SetType::SetPropertyValueSingle: + output += fmt::format( + "openspace.setPropertyValueSingle(\"{}\", {});\n", + p.name, p.value + ); + break; + default: + throw ghoul::MissingCaseException(); + } + } + + // Camera + output += std::visit( + overloaded { + [](const ProfileStruct::CameraNavState& camera) { + std::string result; + result += " openspace.navigation.setNavigationState({"; + result += fmt::format("Anchor = {}, ", camera.anchor); + if (!camera.aim.empty()) { + result += fmt::format("Aim = {}, ", camera.aim); + } + if (!camera.referenceFrame.empty()) { + result += fmt::format("ReferenceFrame = {}, ", camera.referenceFrame); + } + result += fmt::format("Position = {{ {} }}, ", camera.position); + if (!camera.up.empty()) { + result += fmt::format("Up = {{ {} }}, ", camera.up); + } + if (!camera.yaw.empty()) { + result += fmt::format("Yaw = {}, ", camera.yaw); + } + if (!camera.pitch.empty()) { + result += fmt::format("Pitch = {} ", camera.pitch); + } + result += "})\n"; + return result; + }, + [](const ProfileStruct::CameraGoToGeo& camera) { + if (camera.altitude.has_value()) { + return fmt::format( + "openspace.globebrowsing.goToGeo({}, {}, {}, {});\n", + camera.anchor, camera.latitude, camera.longitude, *camera.altitude + ); + } + else { + return fmt::format( + "openspace.globebrowsing.goToGeo({}, {}, {});\n", + camera.anchor, camera.latitude, camera.longitude + ); + } + } + }, + ps.camera + ); + output += "end)\n"; + + return output; +} ProfileFile::ProfileFile(std::string filename) { clearAllFields(); @@ -414,6 +556,7 @@ void ProfileFile::parseAsset(std::string line) { } std::vector standard = { "asset name", + "", "" }; verifyRequiredFields("Asset", fields, standard, assetFieldsExpected); @@ -423,10 +566,10 @@ void ProfileFile::parseAsset(std::string line) { // // New // - if (fields.size() != 2) { + if (fields.size() != 3) { throw ProfileError( _lineNum, - fmt::format("Expected 2 fields in an Asset entry, got {}", fields.size()) + fmt::format("Expected 3 fields in an Asset entry, got {}", fields.size()) ); } @@ -444,6 +587,7 @@ void ProfileFile::parseAsset(std::string line) { fmt::format("Expected asset type 'require' or 'request', got {}", type) ); }(fields[1]); + a.name = fields[2]; profile.assets.push_back(std::move(a)); }