blob: 799470e223e1028fa5b558cbb9c15ea9105f5406 [file] [log] [blame]
// Copyright 2017 The Fuchsia Authors
//
// 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.
#ifndef COBALT_TOOLS_OBSERVATION_QUERIER_OBSERVATION_QUERIER_H_
#define COBALT_TOOLS_OBSERVATION_QUERIER_OBSERVATION_QUERIER_H_
#include <iostream>
#include <memory>
#include <string>
#include <vector>
#include "analyzer/store/observation_store.h"
namespace cobalt {
// The engine for an interactive command-line tool used to query the
// Cobalt ObservationStore. The tools is used by Cobalt developers for
// debugging and demonstrating the Cobalt system. The engine has been abstracted
// from the main program so that it may be tested.
class ObservationQuerier {
public:
static std::unique_ptr<ObservationQuerier> CreateFromFlagsOrDie();
// Construct an ObservationQuerier that will query from the given
// |observation_store|. Interactive output will be written to |ostream|.
// In non-test environments this is usually set to &std::cout.
ObservationQuerier(
uint32_t customer_id, uint32_t project_id,
std::shared_ptr<analyzer::store::ObservationStore> observation_store,
std::ostream* ostream);
// Run() is invoked by main(). It invokes either CommandLoop()
// or CountObservations() depending on the value of the -interactive flag.
void Run();
// Processes a single command. The method is public so an instance of
// ObservationQuerier may be used as a library and driven from another
// program. We use this in unit tests. Returns false if an only if the
// specified command is "quit".
bool ProcessCommandLine(const std::string command_line);
private:
// Implements interactive mode. Reads a command
// from standard input and invokes ProcessCommandLine() until a 'quit'
// command is seen.
void CommandLoop();
// Implements non-interactive mode. Performs a query based on the flags
// and writes the results to std out.
void CountObservations();
bool ProcessCommand(const std::vector<std::string>& command);
void Query(const std::vector<std::string>& command);
void ListParameters();
void SetParameter(const std::vector<std::string>& command);
bool ParseInt(const std::string& str, int64_t* x);
uint32_t customer_ = 1;
uint32_t project_ = 1;
uint32_t metric_ = 1;
std::shared_ptr<analyzer::store::ObservationStore> observation_store_;
std::ostream* ostream_;
};
} // namespace cobalt
#endif // COBALT_TOOLS_OBSERVATION_QUERIER_OBSERVATION_QUERIER_H_