/* SPDX-License-Identifier: GPL-2.0 */
/*
 * C++ stream style string formatter and printer used in KUnit for outputting
 * KUnit messages.
 *
 * Copyright (C) 2019, Google LLC.
 * Author: Brendan Higgins <brendanhiggins@google.com>
 */

#ifndef _KUNIT_KUNIT_STREAM_H
#define _KUNIT_KUNIT_STREAM_H

#include <linux/types.h>
#include <kunit/string-stream.h>

struct kunit;

/**
 * struct kunit_stream - a std::stream style string builder.
 *
 * A std::stream style string builder. Allows messages to be built up and
 * printed all at once.
 */
struct kunit_stream {
	/* private: internal use only. */
	struct kunit *test;
	spinlock_t lock; /* Guards level. */
	const char *level;
	struct string_stream *internal_stream;
};

/**
 * kunit_new_stream() - constructs a new &struct kunit_stream.
 * @test: The test context object.
 *
 * Constructs a new test managed &struct kunit_stream.
 */
struct kunit_stream *kunit_new_stream(struct kunit *test);

/**
 * kunit_stream_set_level(): sets the level that string should be printed at.
 * @this: the stream being operated on.
 * @level: the print level the stream is set to output to.
 *
 * Sets the print level at which the stream outputs.
 */
void kunit_stream_set_level(struct kunit_stream *this, const char *level);

/**
 * kunit_stream_add(): adds the formatted input to the internal buffer.
 * @this: the stream being operated on.
 * @fmt: printf style format string to append to stream.
 *
 * Appends the formatted string, @fmt, to the internal buffer.
 */
void __printf(2, 3) kunit_stream_add(struct kunit_stream *this,
				     const char *fmt, ...);

/**
 * kunit_stream_append(): appends the contents of @other to @this.
 * @this: the stream to which @other is appended.
 * @other: the stream whose contents are appended to @this.
 *
 * Appends the contents of @other to @this.
 */
void kunit_stream_append(struct kunit_stream *this, struct kunit_stream *other);

/**
 * kunit_stream_commit(): prints out the internal buffer to the user.
 * @this: the stream being operated on.
 *
 * Outputs the contents of the internal buffer as a kunit_printk formatted
 * output.
 */
void kunit_stream_commit(struct kunit_stream *this);

/**
 * kunit_stream_clear(): clears the internal buffer.
 * @this: the stream being operated on.
 *
 * Clears the contents of the internal buffer.
 */
void kunit_stream_clear(struct kunit_stream *this);

#endif /* _KUNIT_KUNIT_STREAM_H */
