Skip to content

Commit 6b2d224

Browse files
Refactor CLI parsing; extract output helpers
Split CLI command parsing and execution into parse_* / run_* components and command structs (MonthCmd, CalCmd, YearCmd, EventCmd, DlCmd) to simplify cmd_dispatch.cpp and better handle help/validation. Introduce src/output_common.hpp to consolidate CSV/ICS/eclipse/number formatting and other output helper functions (csv_quote, event_to_ics, node formatting, eclipse JSON/text helpers, is_full_moon_ev, full_moon_dist_km, etc.), remove duplicate implementations from writers_eclipse.cpp, writers_output.cpp and core_common.cpp, and update includes to use the new header. Adjusted writers to call the shared helpers and preserved existing behavior while improving modularity and reuse.
1 parent 3cb036d commit 6b2d224

19 files changed

+3243
-4206
lines changed

src/cli/cmd_dispatch.cpp

Lines changed: 278 additions & 198 deletions
Large diffs are not rendered by default.

src/cli/core_common.cpp

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -104,16 +104,6 @@ void write_meta(JsonWriter&w,const std::string&ephem,
104104
w.obj_end();
105105
}
106106

107-
bool is_full_moon_ev(const EventRec&ev){
108-
return ev.kind=="lunar_phase"&&ev.code=="full_moon";
109-
}
110-
111-
double full_moon_dist_km(EphRead&eph,double jd_utc){
112-
double jd_tdb=TimeScale::utc_to_tdb(jd_utc);
113-
Vec3 r=raw_vec(eph.get_pos(eph.MOON,eph.EARTH,jd_tdb));
114-
return r.norm()*AU_KM;
115-
}
116-
117107
std::vector<LunarEclipse> bld_eclipses(EphRead&eph,const YearResult&yr){
118108
std::vector<LunarEclipse> out;
119109
out.reserve(yr.lun_phase.size());

src/cli/internal.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,5 @@
3232
#include "lunar/time_scale.hpp"
3333

3434
#include "common.hpp"
35+
#include "src/output_common.hpp"
3536

src/cli/writers_eclipse.cpp

Lines changed: 0 additions & 220 deletions
Original file line numberDiff line numberDiff line change
@@ -1,223 +1,3 @@
1-
void wr_enode(JsonWriter&w,double jd_tdb,int tz_off,
2-
const EclipsePointMeta*meta=nullptr){
3-
if(!std::isfinite(jd_tdb)){
4-
w.null_val();
5-
return;
6-
}
7-
double jd_td=TimeScale::tdb_to_tt(jd_tdb);
8-
double jd_utc=TimeScale::tdb_to_utc(jd_tdb);
9-
double jd_ut1=jd_utc;
10-
w.obj_begin();
11-
w.key("jd");
12-
w.value(jd_utc);
13-
w.key("jd_tdb");
14-
w.value(jd_tdb);
15-
w.key("jd_td");
16-
w.value(jd_td);
17-
w.key("jd_ut1");
18-
w.value(jd_ut1);
19-
w.key("jd_utc");
20-
w.value(jd_utc);
21-
w.key("utc_iso");
22-
w.value(fmt_iso(jd_utc,0,true));
23-
w.key("ut1_iso");
24-
w.value(fmt_iso(jd_ut1,0,true));
25-
w.key("td_iso");
26-
w.value(fmt_iso(jd_td,0,true));
27-
w.key("loc_iso");
28-
w.value(fmt_iso(jd_utc,tz_off,true));
29-
w.key("zen_lat_deg");
30-
if(meta&&std::isfinite(meta->zen_lat_deg)){
31-
w.value(meta->zen_lat_deg);
32-
}else{
33-
w.null_val();
34-
}
35-
w.key("zen_lon_deg");
36-
if(meta&&std::isfinite(meta->zen_lon_deg)){
37-
w.value(meta->zen_lon_deg);
38-
}else{
39-
w.null_val();
40-
}
41-
w.key("pa_deg");
42-
if(meta&&std::isfinite(meta->pa_deg)){
43-
w.value(meta->pa_deg);
44-
}else{
45-
w.null_val();
46-
}
47-
w.key("axis_deg");
48-
if(meta&&std::isfinite(meta->axis_deg)){
49-
w.value(meta->axis_deg);
50-
}else{
51-
w.null_val();
52-
}
53-
w.obj_end();
54-
}
55-
56-
void wr_num_or_null(JsonWriter&w,double v){
57-
if(std::isfinite(v)){
58-
w.value(v);
59-
}else{
60-
w.null_val();
61-
}
62-
}
63-
64-
void wr_geo_json(JsonWriter&w,const EclipseGeoCoord&g){
65-
w.obj_begin();
66-
w.key("ra_deg");
67-
wr_num_or_null(w,g.ra_deg);
68-
w.key("dec_deg");
69-
wr_num_or_null(w,g.dec_deg);
70-
w.key("sd_deg");
71-
wr_num_or_null(w,g.sd_deg);
72-
w.key("ehp_deg");
73-
wr_num_or_null(w,g.ehp_deg);
74-
w.obj_end();
75-
}
76-
77-
void wr_lib_json(JsonWriter&w,const EclipseLibration&lib){
78-
w.obj_begin();
79-
w.key("l_deg");
80-
wr_num_or_null(w,lib.l_deg);
81-
w.key("b_deg");
82-
wr_num_or_null(w,lib.b_deg);
83-
w.key("c_deg");
84-
wr_num_or_null(w,lib.c_deg);
85-
w.obj_end();
86-
}
87-
88-
void wr_num_txt(std::ostream&os,double v){
89-
if(std::isfinite(v)){
90-
os<<v;
91-
}else{
92-
os<<"null";
93-
}
94-
}
95-
96-
void wr_node_txt(std::ostream&os,double jd_tdb,const EclipsePointMeta&meta){
97-
if(!std::isfinite(jd_tdb)){
98-
os<<"null\tnull\tnull\tnull\tnull\tnull\tnull";
99-
return;
100-
}
101-
double jd_td=TimeScale::tdb_to_tt(jd_tdb);
102-
double jd_utc=TimeScale::tdb_to_utc(jd_tdb);
103-
double jd_ut1=jd_utc;
104-
wr_num_txt(os,jd_ut1);
105-
os<<"\t";
106-
wr_num_txt(os,jd_td);
107-
os<<"\t";
108-
wr_num_txt(os,jd_utc);
109-
os<<"\t";
110-
wr_num_txt(os,meta.zen_lat_deg);
111-
os<<"\t";
112-
wr_num_txt(os,meta.zen_lon_deg);
113-
os<<"\t";
114-
wr_num_txt(os,meta.pa_deg);
115-
os<<"\t";
116-
wr_num_txt(os,meta.axis_deg);
117-
}
118-
119-
void wr_node_kv(std::ostream&os,const std::string&tag,double jd_tdb,
120-
const EclipsePointMeta&meta){
121-
double jd_td=std::numeric_limits<double>::quiet_NaN();
122-
double jd_utc=std::numeric_limits<double>::quiet_NaN();
123-
double jd_ut1=std::numeric_limits<double>::quiet_NaN();
124-
if(std::isfinite(jd_tdb)){
125-
jd_td=TimeScale::tdb_to_tt(jd_tdb);
126-
jd_utc=TimeScale::tdb_to_utc(jd_tdb);
127-
jd_ut1=jd_utc;
128-
}
129-
os<<tag<<"_jd_ut1=";
130-
wr_num_txt(os,jd_ut1);
131-
os<<"\n";
132-
os<<tag<<"_jd_td=";
133-
wr_num_txt(os,jd_td);
134-
os<<"\n";
135-
os<<tag<<"_jd=";
136-
wr_num_txt(os,jd_utc);
137-
os<<"\n";
138-
os<<tag<<"_zen_lat_deg=";
139-
wr_num_txt(os,meta.zen_lat_deg);
140-
os<<"\n";
141-
os<<tag<<"_zen_lon_deg=";
142-
wr_num_txt(os,meta.zen_lon_deg);
143-
os<<"\n";
144-
os<<tag<<"_pa_deg=";
145-
wr_num_txt(os,meta.pa_deg);
146-
os<<"\n";
147-
os<<tag<<"_axis_deg=";
148-
wr_num_txt(os,meta.axis_deg);
149-
os<<"\n";
150-
}
151-
152-
std::string node_liso(double jd_tdb,int tz_off){
153-
if(!std::isfinite(jd_tdb)){
154-
return "null";
155-
}
156-
double jd_utc=TimeScale::tdb_to_utc(jd_tdb);
157-
return fmt_iso(jd_utc,tz_off,true);
158-
}
159-
160-
void wr_ecljson(JsonWriter&w,const LunarEclipse&ecl,int year,int tz_off){
161-
w.obj_begin();
162-
w.key("kind");
163-
w.value("lunar_eclipse");
164-
w.key("year");
165-
w.value(year);
166-
w.key("has");
167-
w.value(ecl.has);
168-
w.key("type");
169-
w.value(ecl.type);
170-
w.key("pen_mag");
171-
wr_num_or_null(w,ecl.pen_mag);
172-
w.key("umb_mag");
173-
wr_num_or_null(w,ecl.umb_mag);
174-
w.key("rp_re");
175-
wr_num_or_null(w,ecl.rp_re);
176-
w.key("ru_re");
177-
wr_num_or_null(w,ecl.ru_re);
178-
w.key("opp_rp_re");
179-
wr_num_or_null(w,ecl.opp_rp_re);
180-
w.key("opp_ru_re");
181-
wr_num_or_null(w,ecl.opp_ru_re);
182-
w.key("dur_pen_sec");
183-
wr_num_or_null(w,ecl.dur_pen_sec);
184-
w.key("dur_umb_sec");
185-
wr_num_or_null(w,ecl.dur_umb_sec);
186-
w.key("dur_tot_sec");
187-
wr_num_or_null(w,ecl.dur_tot_sec);
188-
w.key("dt_max_sec");
189-
wr_num_or_null(w,ecl.dt_max_sec);
190-
w.key("moon_dist_km");
191-
wr_num_or_null(w,ecl.moon_dist_km);
192-
w.key("gamma");
193-
wr_num_or_null(w,ecl.gamma);
194-
w.key("eps_deg");
195-
wr_num_or_null(w,ecl.eps_deg);
196-
w.key("sun_geo");
197-
wr_geo_json(w,ecl.sun_geo);
198-
w.key("moon_geo");
199-
wr_geo_json(w,ecl.moon_geo);
200-
w.key("lib");
201-
wr_lib_json(w,ecl.lib);
202-
w.key("p1");
203-
wr_enode(w,ecl.jd_tdb_p1,tz_off,&ecl.p1_meta);
204-
w.key("u1");
205-
wr_enode(w,ecl.jd_tdb_u1,tz_off,&ecl.u1_meta);
206-
w.key("opp");
207-
wr_enode(w,ecl.jd_tdb_opp,tz_off,&ecl.opp_meta);
208-
w.key("max");
209-
wr_enode(w,ecl.jd_tdb_max,tz_off,&ecl.max_meta);
210-
w.key("u4");
211-
wr_enode(w,ecl.jd_tdb_u4,tz_off,&ecl.u4_meta);
212-
w.key("p4");
213-
wr_enode(w,ecl.jd_tdb_p4,tz_off,&ecl.p4_meta);
214-
w.key("u2");
215-
wr_enode(w,ecl.jd_tdb_u2,tz_off,&ecl.u2_meta);
216-
w.key("u3");
217-
wr_enode(w,ecl.jd_tdb_u3,tz_off,&ecl.u3_meta);
218-
w.obj_end();
219-
}
220-
2211
void wr_ecltxt(std::ostream&os,const std::vector<LunarEclipse>&items,int tz_off){
2222
os<<"type\tpen_mag\tumb_mag\tgamma\teps_deg\tdt_max_sec\tdur_pen_sec\t"
2233
"dur_umb_sec\tdur_tot_sec\trp_re\tru_re\topp_rp_re\topp_ru_re\t"

src/cli/writers_output.cpp

Lines changed: 1 addition & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -179,52 +179,12 @@ void wr_ejdoc(std::ostream&os,const EventRec&event,const std::string&ephem,
179179
os<<"\n";
180180
}
181181

182-
std::string csv_quote(const std::string&s){
183-
bool need_q=false;
184-
for(char c : s){
185-
if(c==','||c=='"'||c=='\n'||c=='\r'){
186-
need_q=true;
187-
break;
188-
}
189-
}
190-
if(!need_q){
191-
return s;
192-
}
193-
std::string out="\"";
194-
for(char c : s){
195-
if(c=='"'){
196-
out+="\"\"";
197-
}else{
198-
out.push_back(c);
199-
}
200-
}
201-
out.push_back('"');
202-
return out;
203-
}
204-
205-
IcsEvent ev_toics(const EventRec&ev){
206-
IcsEvent out;
207-
std::ostringstream uid;
208-
uid<<"lunar-"<<ev.kind<<"-"<<ev.code<<"-"<<std::setprecision(12)<<ev.jd_utc;
209-
out.uid=uid.str();
210-
out.summary=ev.name;
211-
std::ostringstream desc;
212-
desc<<"kind="<<ev.kind<<"; code="<<ev.code
213-
<<"; jd_utc="<<std::setprecision(17)<<ev.jd_utc;
214-
if(std::isfinite(ev.jd_tdb)){
215-
desc<<"; jd_tdb="<<ev.jd_tdb;
216-
}
217-
out.desc=desc.str();
218-
out.jd_utc=ev.jd_utc;
219-
return out;
220-
}
221-
222182
void wr_eics(std::ostream&os,const std::string&ephem,const std::string&cal_name,
223183
const std::vector<EventRec>&events){
224184
std::vector<IcsEvent> ics_events;
225185
ics_events.reserve(events.size());
226186
for(const auto&ev : events){
227-
ics_events.push_back(ev_toics(ev));
187+
ics_events.push_back(event_to_ics(ev,true));
228188
}
229189
write_ics(os,"lunar-cli//"+tool_ver(),cal_name,ics_events);
230190
}

0 commit comments

Comments
 (0)