]>
git.proxmox.com Git - ceph.git/blob - ceph/src/tools/rbd/OptionPrinter.cc
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2 // vim: ts=8 sw=2 smarttab
4 #include "tools/rbd/OptionPrinter.h"
5 #include "tools/rbd/IndentStream.h"
9 namespace po
= boost::program_options
;
11 const std::string
OptionPrinter::POSITIONAL_ARGUMENTS("Positional arguments");
12 const std::string
OptionPrinter::OPTIONAL_ARGUMENTS("Optional arguments");
14 const size_t OptionPrinter::MAX_DESCRIPTION_OFFSET
;
16 OptionPrinter::OptionPrinter(const OptionsDescription
&positional
,
17 const OptionsDescription
&optional
)
18 : m_positional(positional
), m_optional(optional
) {
21 void OptionPrinter::print_short(std::ostream
&os
, size_t initial_offset
) {
22 size_t name_width
= std::min(initial_offset
, MAX_DESCRIPTION_OFFSET
) + 1;
24 IndentStream
indent_stream(name_width
, initial_offset
, LINE_WIDTH
, os
);
25 indent_stream
.set_delimiter("[");
26 for (size_t i
= 0; i
< m_optional
.options().size(); ++i
) {
27 bool required
= m_optional
.options()[i
]->semantic()->is_required();
31 indent_stream
<< "--" << m_optional
.options()[i
]->long_name();
32 if (m_optional
.options()[i
]->semantic()->max_tokens() != 0) {
33 indent_stream
<< " <" << m_optional
.options()[i
]->long_name() << ">";
41 if (m_optional
.options().size() > 0 || m_positional
.options().size() == 0) {
42 indent_stream
<< std::endl
;
45 if (m_positional
.options().size() > 0) {
46 indent_stream
.set_delimiter(" ");
47 for (size_t i
= 0; i
< m_positional
.options().size(); ++i
) {
48 indent_stream
<< "<" << m_positional
.options()[i
]->long_name() << "> ";
49 if (m_positional
.options()[i
]->semantic()->max_tokens() > 1) {
50 indent_stream
<< "[<" << m_positional
.options()[i
]->long_name()
55 indent_stream
<< std::endl
;
59 void OptionPrinter::print_detailed(std::ostream
&os
) {
60 std::string
indent_prefix(2, ' ');
61 size_t name_width
= compute_name_width(indent_prefix
.size());
63 if (m_positional
.options().size() > 0) {
64 std::cout
<< POSITIONAL_ARGUMENTS
<< std::endl
;
65 for (size_t i
= 0; i
< m_positional
.options().size(); ++i
) {
67 ss
<< indent_prefix
<< "<" << m_positional
.options()[i
]->long_name()
70 std::cout
<< ss
.str();
71 IndentStream
indent_stream(name_width
, ss
.str().size(), LINE_WIDTH
, os
);
72 indent_stream
<< m_positional
.options()[i
]->description() << std::endl
;
74 std::cout
<< std::endl
;
77 if (m_optional
.options().size() > 0) {
78 std::cout
<< OPTIONAL_ARGUMENTS
<< std::endl
;
79 for (size_t i
= 0; i
< m_optional
.options().size(); ++i
) {
82 << m_optional
.options()[i
]->format_name() << " "
83 << m_optional
.options()[i
]->format_parameter();
85 std::cout
<< ss
.str();
86 IndentStream
indent_stream(name_width
, ss
.str().size(), LINE_WIDTH
, os
);
87 indent_stream
<< m_optional
.options()[i
]->description() << std::endl
;
89 std::cout
<< std::endl
;
93 size_t OptionPrinter::compute_name_width(size_t indent
) {
94 size_t width
= MIN_NAME_WIDTH
;
95 std::vector
<OptionsDescription
> descs
= {m_positional
, m_optional
};
96 for (size_t desc_idx
= 0; desc_idx
< descs
.size(); ++desc_idx
) {
97 const OptionsDescription
&desc
= descs
[desc_idx
];
98 for (size_t opt_idx
= 0; opt_idx
< desc
.options().size(); ++opt_idx
) {
99 size_t name_width
= desc
.options()[opt_idx
]->format_name().size() +
100 desc
.options()[opt_idx
]->format_parameter().size()
102 width
= std::max(width
, name_width
);
106 width
= std::min(width
, MAX_DESCRIPTION_OFFSET
) + 1;