Как бы вы структурировали «сложную» проверку и обработку ввода CLI?

#command-line #command-line-arguments

Вопрос:

Я хочу написать инструмент, в котором будет около 15-20 флагов, где некоторые флаги будут разрешены для использования в комбинациях, а другие-нет.

Пример:

Допустимый

 ./do -compare -src some_input_1 -dest some_input_2
 

Не допускается:

 ./do -compare -set some_input
 

Также порядок флагов не имеет значения в моем случае:

это может быть

 ./do -compare -src src_input -dest dest_input
 

или

 ./do -compare -dest dest_input -src src_input
 

Для меня это похоже на дерево, где в зависимости от входных аргументов я буду решать, какой путь выбрать и какой аргумент ожидать дальше. И если к тому времени у меня больше не будет дочерних узлов и все еще останутся входные аргументы, то «неправильный ввод».

Мое понимание:

                 (root)
               /      
          (compare)  (set)
           /    
        (src)  (dest)
          |      |
       (dest)   (src)
 

Как бы вы написали такую программу cli? Какие есть лучшие способы?