' 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.
@startuml
class traffic_ctl {

command :std::shared_ptr<CtrlCommand>
parser: ArgParser
}
note left: ArgParser Invoker
class CtrlCommand {
virtual void execute()
_printer: std::unique_ptr<BasePrinter>
}

class DirectRPCCommand {
void execute()
}
class RecordCommand {
void execute()
}
class XCommand {
void execute()
}


traffic_ctl -|> CtrlCommand
CtrlCommand <|-- RecordCommand
CtrlCommand <|-- DirectRPCCommand
CtrlCommand <|-- XCommand

abstract BasePrinter {
void write_output(JSONRPCResponse)
virtual void write_output(std::string_view)
}
CtrlCommand *-- BasePrinter

class XPrinter{
void write_output(JSONRPCResponse)
}
class DiffConfigPrinter{
void write_output(JSONRPCResponse)
}

class RecordPrinter{
void write_output(JSONRPCResponse)
}

BasePrinter <|-- DiffConfigPrinter
BasePrinter <|-- RecordPrinter
BasePrinter <|-- XPrinter
@enduml
