27 #include <zypp-core/base/DefaultIntegral> 28 #include <zypp-core/base/DtorReset> 32 #include <zypp-core/ui/ProgressData> 39 #include <zypp-tui/output/PromptOptions> 57 inline const char *
qContinue() {
return _(
"Continue?"); }
61 template <
class Tltext,
class Trtext>
62 inline std::string
join(
const Tltext & ltext,
const Trtext & rtext,
const char * sep =
" " )
66 inline bool endsOnWS(
const std::string & str_r )
70 {
int l = *str_r.rbegin();
if ( ::strchr(
" \n\t", l ) ) ret =
true; }
75 {
return(
endsOnWS( str_r ) ?
"" :
" " ); }
93 template <
class TFormater>
struct Writer;
95 ListLayout(
bool singleline_r,
bool wrapline_r,
bool gaped_r,
unsigned indent_r )
109 template <
bool singleline_,
bool wrapline_,
bool gaped_,
unsigned indent_>
126 template <
class TFormater>
struct Writer;
142 inline std::string
asListElement(
const std::string & val_r ) {
return val_r; }
146 template <
class Tp =
void>
155 TableRow asTableRow(
const Tp & val_r );
190 {
return asTableHeader<>(); }
202 template <
class TFormater>
209 {
return _formater.xmlListElement( val_r ); }
229 template <
class TFormater>
230 struct ListLayout::Writer
248 const std::string & element(
_formater.listElement( std::forward<Tp>(val_r) ) );
278 {
_cpos += element_r.size();
_str << element_r; }
296 template <
class TFormater>
329 template <
class TContainer,
class TFormater,
class TLayout =
typename TFormater::NormalLayout>
330 void writeContainer( std::ostream & str_r,
const TContainer & container_r,
const TFormater & formater_r,
const TLayout & layout_r = TLayout() )
332 typedef typename TLayout::template Writer<TFormater> Writer;
333 Writer writer( str_r, layout_r, formater_r );
334 for (
auto && el : container_r )
339 template <
class TContainer,
class TFormater>
340 void xmlWriteContainer( std::ostream & str_r,
const TContainer & container_r,
const TFormater & formater_r )
372 std::string
get()
const 373 {
return std::string(
lhs) + std::string(
rhs); }
378 std::string
get(
unsigned width_r, SplitFlags flags_r,
char exp_r )
const;
380 std::string
get(
unsigned width_r, SplitFlags flags_r )
const 381 {
return get( width_r, flags_r,
expHint ); }
383 std::string
get(
unsigned width_r,
char exp_r )
const 384 {
return get( width_r,
flagsHint, exp_r ); }
386 std::string
get(
unsigned width_r )
const 490 XmlNode(
Out & out_r,
const std::string & name_r,
const std::initializer_list<Attr> & attrs_r = {} )
499 :
XmlNode( out_r, name_r, { std::move(attr_r) } )
506 zypp::scoped_ptr<zypp::xmlout::Node>
_node;
515 void xmlNode(
const std::string & name_r,
const std::initializer_list<XmlNode::Attr> & attrs_r = {} )
519 {
xmlNode( name_r, { std::move(attr_r) } ); }
528 {
if (
out().
typeNORMAL() && ! title_r.empty() ) std::cout << title_r << std::endl; }
534 template <
class TContainer,
class TFormater>
535 void container(
const std::string & nodeName_r,
const std::string & title_r,
536 const TContainer & container_r,
const TFormater & formater_r )
554 template <
class TContainer,
class TFormater = out::ListFormater>
555 void list(
const std::string & nodeName_r,
const std::string & title_r,
556 const TContainer & container_r,
const TFormater & formater_r = TFormater() )
557 {
container( nodeName_r, title_r, container_r, formater_r ); }
561 template <
class TContainer,
class TFormater = out::TableFormater>
562 void table(
const std::string & nodeName_r,
const std::string & title_r,
563 const TContainer & container_r,
const TFormater & formater_r = TFormater() )
564 {
container( nodeName_r, title_r, container_r, formater_r ); }
579 template <
class Text>
588 template <
class Text>
590 {
par( 0, text_r, format_r ); }
594 template <
class TText,
class Text>
598 template <
class TText,
class Text>
600 {
taggedPar( 0, tag_r, text_r, format_r ); }
604 template <
class Text>
608 template <
class Text>
610 {
notePar( 0, text_r, format_r ); }
613 template <
class Text>
617 template <
class Text>
622 template <
class Text>
626 template <
class Text>
628 {
errorPar( 0, text_r, format_r ); }
651 {
info( msg_r.
get(), verbosity_r, mask_r ); }
659 ,
_str( new
std::ostringstream )
664 ,
_str( std::move(rhs._str) )
672 {
return (*
_str) << val; }
674 operator std::ostream &()
681 std::unique_ptr<std::ostringstream>
_str;
692 outstr.
rhs <<
' ' << rmsg;
701 outstr.
rhs <<
" (" << hint <<
')';
732 virtual void error(
const std::string & problem_desc,
const std::string & hint =
"") = 0;
743 const std::string & problem_desc,
744 const std::string & hint =
"") = 0;
765 const std::string & label,
766 bool is_tick =
false) = 0;
777 virtual void progress(
const std::string &
id,
778 const std::string & label,
792 const std::string & label,
793 const std::string & donetag,
794 bool error =
false) = 0;
858 const std::string &
prompt,
860 const std::string & startdesc =
"") = 0;
887 #define SCOPED_VERBOSITY( OUT, LEVEL ) const auto & raii __attribute__ ((__unused__))( (OUT).scopedVerbosity( LEVEL )) 918 ret = desired_r ? desired_r : 150U;
919 else if ( desired_r < ret )
1001 ProgressBar(
Out & out_r,
NoStartBar, std::string progressId_r,
const std::string & label_r,
unsigned current_r = 0,
unsigned total_r = 0 )
1007 else if ( current_r )
1021 ProgressBar(
Out & out_r,
const std::string & progressId_r,
const std::string & label_r,
unsigned current_r = 0,
unsigned total_r = 0 )
1028 ProgressBar(
Out & out_r,
const std::string & label_r,
unsigned current_r = 0,
unsigned total_r = 0 )
1029 :
ProgressBar( out_r,
"", label_r, current_r, total_r )
1049 void print(
const std::string & label_r )
1065 void error(
const std::string & label_r )
1104 std::string
outLabel(
const std::string & msg_r )
const 1108 {
int ret = 1;
while ( num_r /= 10 ) ++ret;
return ret; }
1157 Error(
int exitcode_r, std::string msg_r, std::string hint_r = std::string() )
zypp::ProgressData * operator->()
virtual void setUseColors(bool yesno)
Hint for a handler whether config would allow to use colors.
Convenience class for progress output.
std::ostream & node(std::ostream &out_r, const std::string &name_r, Node::Attr attr_r)
ProgressBar(Out &out_r, const std::string &progressId_r, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
Ctor displays initial progress bar.
virtual std::string zyppExceptionReport(const zypp::Exception &e)
Return a Exception as a string suitable for output.
void errorPar(const Text &text_r, ParFormat format_r=ParFormat())
void infoLRHint(const std::string &lmsg, const std::string &hint, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)
Info message with R-adjusted "(hint)".
zypp::ProgressData & operator*()
XmlNode(XmlNode &&rhs) noexcept
Move ctor.
void mbs_write_wrapped(std::ostream &out, boost::string_ref text_r, size_t indent_r, size_t wrap_r, int indentFix_r=0)
Wrap and indent given text and write it to the output stream out.
boost::logic::tribool TriBool
3-state boolean logic (true, false and indeterminate).
Colored string if do_colors.
void taggedPar(size_t indent_r, const TText &tag_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph of text preceded by 'tag_r' and a ' '.
void notePar(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph tagged with 'Note: '.
void sendTo(const ReceiverFnc &fnc_r)
Set ReceiverFnc.
Base class for producing common (for now) zypper output.
bool type(TypeBit type_r) const
Test for a specific type.
RAII writing a nodes start/end tag.
zypp::DtorReset scopedVerbosity(Verbosity verbosity_r)
Return RAII class for exception safe scoped verbosity change.
unsigned _indent
amount of indent
virtual void warning(const std::string &msg, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)=0
Show a warning.
Writer(std::ostream &str_r, const ListLayout &layout_r, const TFormater &formater_r)
XmlNode with optional normal text headline (NL appended)
bool _gaped
add extra NL before element (if singleline)
virtual void dwnldProgress(const zypp::Url &uri, int value=-1, long rate=-1)=0
Reports download progress.
void error(ProgressEnd donetag_r=ProgressEnd::error)
Explicitly indicate the error condition for the final progress bar.
Print(ProgressBar &bar_r)
static constexpr unsigned termwidthUnlimited
const zypp::ProgressData & operator*() const
Error(int exitcode_r, std::string msg_r, std::string hint_r=std::string())
virtual void progressEnd(const std::string &id, const std::string &label, const std::string &donetag, bool error=false)=0
End of an operation with reported progress.
void xmlWriteContainer(std::ostream &str_r, const TContainer &container_r, const TFormater &formater_r)
Write XML formatted container to stream.
bool fitsOnLine(unsigned size_r) const
const std::string & asString(const std::string &t)
Global asString() that works with std::string too.
Example: PromptOptions popts; popts.setOptions(_("y/n/p"), 0 / * default reply * /); popts...
TableHeader asTableHeader< void >()
XmlNode(Out &out_r, const std::string &name_r, const std::initializer_list< Attr > &attrs_r={})
Ctor taking nodename and attribute list.
bool _singleline
one list element per line
Verbosity verbosity() const
Get current verbosity.
const TFormater & _formater
std::unique_ptr< std::ostringstream > _str
std::string form(const char *format,...) __attribute__((format(printf
Printf style construction of std::string.
More detailed description of the operations.
Error(int exitcode_r, const zypp::Exception &ex_r, std::string hint_r=std::string())
Error(int exitcode_r, std::string msg_r, const zypp::Exception &ex_r, std::string hint_r=std::string())
(Key, Value) string pair of XML node attributes
std::ostream & printRichText(std::ostream &str, std::string text, unsigned indent_r=0U, unsigned width_r=0U)
Print [Rich]Text optionally indented.
const std::ostream & stream() const
CCString< ColorContext::MSG_WARNING > MSG_WARNINGString
void par(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph of text, optionally indented, or without leading gap.
Convenience class Error reporting.
Assign a vaiable a certain value when going out of scope.
zypp::scoped_ptr< zypp::xmlout::Node > _node
std::optional< ProgressEnd > _donetag
void setVerbosity(Verbosity verbosity)
Set current verbosity.
bool operator()(const zypp::ProgressData &progress_r)
virtual void infoLine(const TermLine &msg_r, Verbosity verbosity_r=NORMAL, Type mask_r=TYPE_ALL)
info taking a TermLine
bool endsOnWS(const std::string &str_r)
Whether the str_r ends with a WS.
const TFormater & _formater
zypp::ProgressData _progress
void error(const char *label_r)
Convenient building of std::string via std::ostringstream Basically a std::ostringstream autoconverti...
detail::ListLayoutInit< true, true, false, 0U > DefaultListLayout
one element per line, no indent
TermLine(SplitFlags flags_r)
TableLayout DefaultTableLayout
Simple Table.
static constexpr Type TYPE_ALL
void writeContainer(std::ostream &str_r, const TContainer &container_r, const TFormater &formater_r, const TLayout &layout_r=TLayout())
Write formatted container to stream.
Table & setHeader(TableHeader tr)
Default output verbosity level.
void xmlNode(const std::string &name_r, const std::initializer_list< XmlNode::Attr > &attrs_r={})
XML only: Write a leaf node without PCDATA.
ZYPP_DECLARE_FLAGS(Type, TypeBit)
detail::ListLayoutInit< true, false, false, 0U > XmlListLayout
ProgressBar(Out &out_r, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
virtual unsigned termwidth() const
Width for formatted output [0==unlimited].
Maintain [min,max] and counter (value) for progress counting.
Out(TypeBit type, Verbosity verbosity=NORMAL)
virtual void dwnldProgressEnd(const zypp::Url &uri, long rate=-1, zypp::TriBool error=false)=0
Reports end of a download.
Write out a Table according to the layout.
zypp::DefaultIntegral< int,-1 > percentHint
static constexpr NoStartBar noStartBar
Indicator argument for ctor not drawing an initial start bar.
CCString< ColorContext::MSG_ERROR > MSG_ERRORString
const std::string _indent
const unsigned _linewidth
desired line width
void noSend()
Set no ReceiverFnc.
ProgressEnd
ProgressBars default end tags.
TypeBit
Known output types implemented by derived classes.
void print()
Immediately print the progress bar not waiting for a new trigger.
void notePar(const Text &text_r, ParFormat format_r=ParFormat())
std::string get() const
Return plain line made of lhs + rhs.
TermLine(SplitFlags flags_r, char exp_r)
unsigned defaultTermwidth()
virtual void info(const std::string &msg, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)=0
Show an info message.
std::string numstring(char n, int w=0)
void info(std::string msg, const std::string &msg2, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)
void errorPar(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph tagged with 'Error: '.
ListLayout(bool singleline_r, bool wrapline_r, bool gaped_r, unsigned indent_r)
Indicator type for ctor not drawing an initial start bar.
void print(const std::string &label_r)
Info(Out::Info &&rhs) noexcept
virtual void progressStart(const std::string &id, const std::string &label, bool is_tick=false)=0
Start of an operation with reported progress.
virtual bool progressFilter()
Determine whether to show progress.
std::ostream & operator<<(const Tp &val)
Only important messages (no progress or status, only the result).
void table(const std::string &nodeName_r, const std::string &title_r, const TContainer &container_r, const TFormater &formater_r=TFormater())
Write table from container creating a TitleNode with size="nnn" attribute and replacing optional %1% ...
std::string asXmlListElement(const std::string &val_r)
static constexpr Type TYPE_NONE
Verbosity
Verbosity levels.
std::string asListElement(const std::string &val_r)
void par(const Text &text_r, ParFormat format_r=ParFormat())
void xmlNode(const std::string &name_r, XmlNode::Attr attr_r)
unsigned defaultFormatWidth(unsigned desired_r=0) const
Terminal width or 150 if unlimited.
Base class for Exception.
ProgressBar(Out &out_r, NoStartBar, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
virtual void dwnldProgressStart(const zypp::Url &uri)=0
Reoprt start of a download.
ProgressBar(Out &out_r, NoStartBar, std::string progressId_r, const std::string &label_r, unsigned current_r=0, unsigned total_r=0)
Ctor not displaying an initial progress bar.
const TableLayout & _layout
void errorreset()
Reset any error condition.
virtual void progress(const std::string &id, const std::string &label, int value=-1)=0
Progress report for an on-going operation.
const ListLayout & _layout
ZYPP_DECLARE_FLAGS(SplitFlags, SplitFlag)
ZYPP_DECLARE_OPERATORS_FOR_FLAGS(TermLine::SplitFlags)
XML only: RAII writing a XML nodes start/end tag.
ProgressData::ReceiverFnc printing to a ProgressBar.
Convenience base class storing the back reference to Out.
value_type reportValue() const
const char * optBlankAfter(const std::string &str_r)
void printAndCount(const std::string &element_r) const
Write out a List according to the layout.
void gap()
NORMAL: An empty line.
void error(const std::string &label_r)
TitleNode(XmlNode &&node_r, const std::string &title_r="")
int report(Application &app_r) const
Default way of processing a caught Error exception.
TypeBit type() const
Return the type of the instance.
virtual void promptHelp(const PromptOptions &poptions)=0
Print help for prompt, if available.
virtual void searchResult(const Table &table_r)
Print out a search result.
void infoLR(const std::string &lmsg, const std::string &rmsg, Verbosity verbosity=NORMAL, Type mask=TYPE_ALL)
Info message, 2 strings L/R-adjusted.
std::string join(const Tltext <ext, const Trtext &rtext, const char *sep=" ")
Simple join of two string types.
bool _wrapline
fold lines longer than _linewidth
static std::string combine(std::string &&msg_r, const zypp::Exception &ex_r)
zypp::DefaultIntegral< char,' '> expHint
void progressEnd(const std::string &id, const std::string &label, bool error=false)
void operator<<(Tp &&val_r) const
void name(const std::string &name_r)
Set counter name.
CCString< ColorContext::HIGHLIGHT > HIGHLIGHTString
void printRichText(std::string text, unsigned indent_r=0U)
int numDigits(unsigned num_r) const
void taggedPar(const TText &tag_r, const Text &text_r, ParFormat format_r=ParFormat())
void operator<<(Tp &&val_r) const
virtual bool mine(Type type)=0
Determine whether the output is intended for the particular type.
XmlNode(Out &out_r, const std::string &name_r, Attr attr_r)
Convenience ctor for one attribute pair.
~ProgressBar()
Dtor displays final progress bar.
std::string outLabel(const std::string &msg_r) const
bool reportPercent() const
virtual void error(const std::string &problem_desc, const std::string &hint="")=0
Show an error message and an optional hint.
void warningPar(size_t indent_r, const Text &text_r, ParFormat format_r=ParFormat())
Paragraph tagged with 'Warning: '.
virtual void prompt(PromptId id, const std::string &prompt, const PromptOptions &poptions, const std::string &startdesc="")=0
Prompt the user for a decision.
Writer(std::ostream &str_r, const TableLayout &layout_r, const TFormater &formater_r)
void list(const std::string &nodeName_r, const std::string &title_r, const TContainer &container_r, const TFormater &formater_r=TFormater())
Write list from container creating a TitleNode with size="nnn" attribute and replacing optional %1% i...
Class representing an application (appdata.xml)
const zypp::ProgressData * operator->() const
void warningPar(const Text &text_r, ParFormat format_r=ParFormat())
void container(const std::string &nodeName_r, const std::string &title_r, const TContainer &container_r, const TFormater &formater_r)
Write container creating a TitleNode with size="nnn" attribute and replacing optional %1% in title_r ...
boost::noncopyable NonCopyable
Ensure derived classes cannot be copied.