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

#include "launch_service.h"
#include "lib/pkg_url/fuchsia_pkg_url.h"

namespace netemul {
namespace config {

LaunchService::LaunchService(std::string name) : name_(std::move(name)) {}

bool LaunchService::ParseFromJSON(const rapidjson::Value& value,
                                  json::JSONParser* parser) {
  return launch_.ParseFromJSON(value, parser);
}

const std::string& LaunchService::name() const { return name_; }

const LaunchApp& LaunchService::launch() const { return launch_; }

}  // namespace config
}  // namespace netemul