// Copyright 2019 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 "peridot/lib/util/pseudo_dir_utils.h"

#include <src/lib/fxl/strings/split_string.h>

namespace modular {

std::unique_ptr<vfs::PseudoDir> MakeFilePathWithContents(const std::string& file_path,
                                                         const std::string& file_contents) {
  auto file_path_split =
      fxl::SplitStringCopy(file_path, "/", fxl::kTrimWhitespace, fxl::kSplitWantNonEmpty);

  // This is the root-level directory containing |file_path|.
  auto config_dir = std::make_unique<vfs::PseudoDir>();
  auto* last_subdir = config_dir.get();

  // 1. Make each directory in |file_path_split|, except for the last one
  //    which is the file  name.
  for (size_t i = 0; i < file_path_split.size() - 1; i++) {
    auto subdir = std::make_unique<vfs::PseudoDir>();
    auto* subdir_raw = subdir.get();
    last_subdir->AddEntry(file_path_split[i], std::move(subdir));
    last_subdir = subdir_raw;
  }

  // 2. The last component of |file_path_split| is the file -- have it hang off
  // of the last directory.
  last_subdir->AddEntry(file_path_split.back(),
                        std::make_unique<vfs::PseudoFile>(
                            file_contents.size(),
                            [file_contents](std::vector<uint8_t>* out, size_t /*unused*/) {
                              std::copy(file_contents.begin(), file_contents.end(),
                                        std::back_inserter(*out));
                              return ZX_OK;
                            },
                            vfs::PseudoFile::WriteHandler() /* not used */
                            ));

  return config_dir;
}

};  // namespace modular
