/* * Copyright (C) 2022 Riyyi * * SPDX-License-Identifier: MIT */ #pragma once #include // int32_t, uint32_t #include // function #include #include #include namespace Util { using LineCallback = std::function&)>; class System { public: System(); virtual ~System() {} enum FileDescriptor { ReadFileDescriptor, WriteFileDescriptor, }; System operator()(); System operator()(const char* command); System operator()(std::string command); System operator()(std::string_view command); System operator()(const std::vector& arguments); System operator()(const std::vector& arguments); System operator()(const std::vector& arguments); // Operator order // + -> | -> && -> || System operator+(System rhs); System operator|(System rhs); System operator&&(System rhs); System operator||(System rhs); System& cut(uint32_t field, char delimiter = '\t'); System& sort(bool unique = false); System& tail(int32_t number, bool starting = false); System& apply(LineCallback callback); void print(const std::vector& arguments); const std::vector& arguments() const { return m_arguments; } std::string output() const { return m_output; } std::string error() const { return m_error; } int status() const { return m_status; } private: System(const std::vector& arguments); System exec(std::string input = ""); void readFromFileDescriptor(int fileDescriptor[2], std::string& output); std::vector m_arguments; std::string m_output; std::string m_error; int m_status { 0 }; }; } // namespace Util