/*
 * Copyright (C) 2015, The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#pragma once

#include <memory>
#include <ostream>
#include <string>

#include <stdio.h>

namespace android {
namespace aidl {

class CodeWriter;
using CodeWriterPtr = std::unique_ptr<CodeWriter>;

class CodeWriter {
 public:
  // Get a CodeWriter that writes to a file. When filename is "-",
  // it is written to stdout.
  static CodeWriterPtr ForFile(const std::string& filename);
  // Get a CodeWriter that writes to a string buffer.
  // The buffer gets updated only after Close() is called or the CodeWriter
  // is deleted -- much like a real file.
  static CodeWriterPtr ForString(std::string* buf);
  // Write a formatted string to this writer in the usual printf sense.
  // Returns false on error.
  virtual bool Write(const char* format, ...) __attribute__((format(printf, 2, 3)));
  void Indent();
  void Dedent();
  virtual bool Close();
  virtual ~CodeWriter() = default;
  CodeWriter() = default;

  CodeWriter& operator<<(const char* s);
  CodeWriter& operator<<(const std::string& str);

 private:
  CodeWriter(std::unique_ptr<std::ostream> ostream);
  std::string ApplyIndent(const std::string& str);
  const std::unique_ptr<std::ostream> ostream_;
  int indent_level_ {0};
  bool start_of_line_ {true};
};

}  // namespace aidl
}  // namespace android
