/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you 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. */ module thrift.base; /** * Common base class for all Thrift exceptions. */ class TException : Exception { /// this(string msg = "", string file = __FILE__, size_t line = __LINE__, Throwable next = null) { super(msg, file, line, next); } } /** * An operation failed because one or more sub-tasks failed. */ class TCompoundOperationException : TException { /// this(string msg, Exception[] exceptions, string file = __FILE__, size_t line = __LINE__, Throwable next = null) { super(msg, file, line, next); this.exceptions = exceptions; } /// The exceptions thrown by the children of the operation. If applicable, /// the list is ordered in the same way the exceptions occured. Exception[] exceptions; } /// The Thrift version string, used for informative purposes. // Note: This is currently hardcoded, but will likely be filled in by the build // system in future versions. enum VERSION = "0.9.2"; /** * Functions used for logging inside Thrift. * * By default, the formatted messages are written to stdout/stderr, but this * behavior can be overwritten by providing custom g_{Info, Error}LogSink * handlers. * * Examples: * --- * logInfo("An informative message."); * logError("Some error occured: %s", e); * --- */ alias logFormatted!g_infoLogSink logInfo; alias logFormatted!g_errorLogSink logError; /// Ditto /** * Error and info log message sinks. * * These delegates are called with the log message passed as const(char)[] * argument, and can be overwritten to hook the Thrift libraries up with a * custom logging system. By default, they forward all output to stdout/stderr. */ __gshared void delegate(const(char)[]) g_infoLogSink; __gshared void delegate(const(char)[]) g_errorLogSink; /// Ditto shared static this() { import std.stdio; g_infoLogSink = (const(char)[] text) { stdout.writeln(text); }; g_errorLogSink = (const(char)[] text) { stderr.writeln(text); }; } // This should be private, if it could still be used through the aliases then. template logFormatted(alias target) { void logFormatted(string file = __FILE__, int line = __LINE__, T...)(string format, T args) if ( __traits(compiles, { target(""); }) ) { import std.format, std.stdio; if (target !is null) { scope(exit) g_formatBuffer.clear(); // Phobos @@BUG@@: If the empty string put() is removed, Appender.data // stays empty. g_formatBuffer.put(""); formattedWrite(g_formatBuffer, "%s:%s: ", file, line); static if (T.length == 0) { g_formatBuffer.put(format); } else { formattedWrite(g_formatBuffer, format, args); } target(g_formatBuffer.data); } } } private { // Use a global, but thread-local buffer for constructing log messages. import std.array : Appender; Appender!(char[]) g_formatBuffer; }