C/C++ Argument Parser

Katılım
18 Aralık 2018
Mesajlar
9.112
Makaleler
14
Çözümler
128
Yer
Dubai
Aylar once Python'daki argparse kutuphanesinden etkilenip C++'ta da benzer bi sey gelistirmek istemistim. Bir iki gun icerisinde dandirik bir sey yapmis ve birakmistim. Simdi aklima geldi bi daha, eski fikrin ustune katmak istedim.


Fikir temel olarak gelistiricinin CLI argumanlarini parse etmesine yardimci olmaya yariyor. Platform dependent uc adet parser var. MacOS, Linux ve Windows. (Windows'u daha implemente etmedim. Linux olanda biraz duzeltme istiyor aslinda.) Bir de testing icin Fake Parser var. Elle veriyorsunuz arguman listesini. Digerleri kendi alir platformdan.

Daha cok eksigi var ama en azindan multi-type parameter destegini daha duzgun hale getirip ozellestirilebilir hale getirince, paylasmak istedim. Ozellikle help kismi ve required arg kismina biraz daha ceki duzen vermem gerekiyor. Bi de flagleri sadece action degil de store'da yapabilmek lazim. Tabii liste/multi token parse'da lazim. Usenmedigim bi ara daha da ustune eklerim.

Ozellikler;
1. Custom type -> Kendi parametre tiplerinizi ekleyebiliyorsunuz. Ornegin main.cpp dosyasinda Point sinifi icin type-trait olusturup ona ozel bi echo aksiyonu ekledim. Boylece CLI'dan gelen 3,2 direkt Point sinifina donusup geliyor fonksiyonunuza. Tabii ki parser mantigini sizin yazmaniz gerekiyor custom typelar icin.
2. Custom convention + multi convention -> Convention kisaca argumanlarin konsolda nasil ifade edildikleri. Ben basitce ornek olarak GNU'nun arguman conventionini yaptim. GNU'nunki uzun formda -- ile, kisa formda - ile baslar, degerler genelde bir sonraki tokendedir. Esittir isareti ilen olan varyasyonu da var. Ayni sekilde aslar ama deger ayni tokende = ile ayrilmistir. Custom convention mantigiyla kendi conventionlarinizi yada gormeyi istediginizi kendiniz ekleyip parser'a verebiliyorsunuz. Ek olarak birden fazlayi destekliyor. Dolayisiyla conventionlardan biri basarisiz olursa digerini deneyebiliyor. Eger ayni kurallara sahip iki tane varsa, listedeki ilki kazanir her zaman.

Daha farkli fikirleriniz varsa, paylasabilirsiniz. Saygi cercevesinde elestiriye de acigim.

Public API'i degistirdim biraz daha;

C++:
using namespace argument_parser::v2::flags;

argument_parser::v2::macos_parser parser;

parser.add_argument<std::string>({
    { ShortArgument, "e" },
    { LongArgument, "echo" },
    { Action, echo },
    { HelpText, "echoes given variable." }
});

parser.add_argument({
    { ShortArgument, "s" },
    { LongArgument, "store-flag" },
    { HelpText, "stores a flag" }
});


parser.add_argument<Point>({
    { ShortArgument, "sp" },
    { LongArgument, "store-point" },
    { HelpText, "stores a point" }
});

Onceden su sekildeydi;
C++:
argument_parser::parser parser;

parser.add_argument("e", "echo", "echoes given variable", echo, false);
parser.add_argument("s", "store-flag", "stores a flag", false);
parser.add_argument<Point>("sp", "store-point", "stores a point", false);

Daha okunakli oldugunu dusunuyorum. Eger bi argumani required yapmak gerekiyorsa, { Required, true } eklendiginde onu required yapiyor.
 
Son düzenleme:

Technopat Haberler

Yeni konular

Geri
Yukarı