[Mlir-commits] [mlir] [mlir-lsp] Abstract input and output of the `JSONTransport` (PR #129320)
River Riddle
llvmlistbot at llvm.org
Fri Feb 28 15:29:16 PST 2025
================
@@ -43,14 +43,86 @@ enum JSONStreamStyle {
Delimited
};
+/// An abstract class used by the JSONTransport to read JSON message.
+class JSONTransportInput {
+public:
+ explicit JSONTransportInput(JSONStreamStyle style = JSONStreamStyle::Standard)
+ : style(style) {}
+ virtual ~JSONTransportInput() = default;
+
+ virtual bool getError() const = 0;
+ virtual bool isEndOfInput() const = 0;
+
+ /// Read in a message from the input stream.
+ virtual LogicalResult readMessage(std::string &json) {
+ return style == JSONStreamStyle::Delimited ? readDelimitedMessage(json)
+ : readStandardMessage(json);
+ }
+ virtual LogicalResult readDelimitedMessage(std::string &json) = 0;
+ virtual LogicalResult readStandardMessage(std::string &json) = 0;
+
+private:
+ /// The JSON stream style to use.
+ JSONStreamStyle style;
+};
+
+/// An abstract class used by the JSONTransport to write JSON messages.
+class JSONTransportOutput {
+public:
+ explicit JSONTransportOutput() = default;
+ virtual ~JSONTransportOutput() = default;
+
+ virtual void sendMessage(const llvm::json::Value &msg) = 0;
+};
+
+/// Concrete implementation of the JSONTransportInput that reads from a file.
+class JSONTransportInputOverFile : public JSONTransportInput {
+public:
+ explicit JSONTransportInputOverFile(
+ std::FILE *in, JSONStreamStyle style = JSONStreamStyle::Standard)
+ : JSONTransportInput(style), in(in) {}
+
+ bool getError() const final { return ferror(in); }
+ bool isEndOfInput() const final { return feof(in); }
+
+ LogicalResult readDelimitedMessage(std::string &json) final;
+ LogicalResult readStandardMessage(std::string &json) final;
+
+private:
+ std::FILE *in;
+};
+
+/// Concrete implementation of the JSONTransportOutput that writes to a stream.
+class JSONTransportOutputOverStream : public JSONTransportOutput {
----------------
River707 wrote:
That's not the goal of the output stream abstraction, implementations of raw_ostream describe the capabilities of the stream, it's up to the user to decide which capabilities it wants to take advantage of. That is an example of a good abstraction, because it's reusable across different use-cases and domains. Consider, for example, if we needed to provide an output abstraction for file output for everything that may write to a file. Consider the ease of use today for raw_ostream, if an implementation already exists for your output type (which is the case most often) you have nothing else to do to take advantage of the API.
https://github.com/llvm/llvm-project/pull/129320
More information about the Mlir-commits
mailing list