11import std/ [os, strformat, strutils]
2- import " ." / [approaches, articles, exercises]
2+ import " ." / [approaches, articles, exercises, track_config ]
33import " .." / [cli, helpers, logger, sync/ sync_common, sync/ sync,
44 types_exercise_config, types_track_config]
55
66type
77 DocumentKind * = enum
8- dkExerciseConfig,
8+ dkTrackConfig,
9+ dkConceptExerciseConfig,
10+ dkPracticeExerciseConfig,
911 dkApproachesConfig,
1012 dkArticlesConfig
1113
1517 formattedDocument: string
1618
1719iterator getConfigPaths (trackExerciseSlugs: TrackExerciseSlugs ,
18- trackExercisesDir: string ): (ExerciseKind , DocumentKind , string ) =
20+ conf: Conf ): (DocumentKind , string ) =
21+ let trackDir = conf.trackDir
22+
23+ # # Yield the track's `config.json` file, but only when the user
24+ # # is not formatting a single exercise
25+ if conf.action.exerciseFmt.len == 0 :
26+ yield (dkTrackConfig, trackDir / " config.json" )
27+
1928 # # Yields the `.meta/config.json`, `.approaches/config.json` and
2029 # # `.articles/config.json` paths for each exercise in
2130 # # `trackExerciseSlugs` in `trackExercisesDir`.
31+ let trackExercisesDir = trackDir / " exercises"
2232 for exerciseKind in [ekConcept, ekPractice]:
33+ let documentKind =
34+ case exerciseKind
35+ of ekConcept: dkConceptExerciseConfig
36+ of ekPractice: dkPracticeExerciseConfig
2337 let slugs =
2438 case exerciseKind
2539 of ekConcept: trackExerciseSlugs.`concept`
@@ -34,34 +48,37 @@ iterator getConfigPaths(trackExerciseSlugs: TrackExerciseSlugs,
3448 for slug in slugs:
3549 trackExerciseConfigPath.truncateAndAdd (startLen, slug)
3650 trackExerciseConfigPath.addExerciseConfigPath ()
37- yield (exerciseKind, dkExerciseConfig , trackExerciseConfigPath)
51+ yield (documentKind , trackExerciseConfigPath)
3852
3953 trackExerciseConfigPath.truncateAndAdd (startLen, slug)
4054 trackExerciseConfigPath.addApproachesConfigPath ()
4155 if fileExists (trackExerciseConfigPath):
42- yield (exerciseKind, dkApproachesConfig, trackExerciseConfigPath)
56+ yield (dkApproachesConfig, trackExerciseConfigPath)
4357
4458 trackExerciseConfigPath.truncateAndAdd (startLen, slug)
4559 trackExerciseConfigPath.addArticlesConfigPath ()
4660 if fileExists (trackExerciseConfigPath):
47- yield (exerciseKind, dkArticlesConfig, trackExerciseConfigPath)
61+ yield (dkArticlesConfig, trackExerciseConfigPath)
4862
4963proc fmtImpl (trackExerciseSlugs: TrackExerciseSlugs ,
50- trackDir: string ): seq [PathAndFormattedDocument ] =
51- # # Reads the config files for every slug in `trackExerciseSlugs`
52- # # in `trackExerciseDir`.
64+ conf: Conf ): seq [PathAndFormattedDocument ] =
65+ # # Reads the track config file and all exercise config files
66+ # # for every slug in `trackExerciseSlugs` in `trackExerciseDir`.
5367 # # This includes `.meta/config.json`, `.approaches/config.json`
54- # # and `.articles/config.json`.
68+ # # and `.articles/config.json` for each exercise, and `config.json`
69+ # # for the track.
5570 # #
5671 # # Returns a seq of (document kind, path, formatted document) objects
57- # # containing every exercise's configs that are not already formatted.
58- let trackExercisesDir = trackDir / " exercises"
72+ # # containing every document that is not already formatted.
5973 var seenUnformatted = false
60- for (exerciseKind, documentKind, configPath) in getConfigPaths (trackExerciseSlugs,
61- trackExercisesDir):
74+ let trackDir = conf.trackDir
75+ for (documentKind, configPath) in getConfigPaths (trackExerciseSlugs,
76+ conf):
6277 let formatted =
6378 case documentKind
64- of dkExerciseConfig: formatExerciseConfigFile (exerciseKind, configPath)
79+ of dkTrackConfig: formatTrackConfigFile (configPath)
80+ of dkConceptExerciseConfig: formatExerciseConfigFile (ekConcept, configPath)
81+ of dkPracticeExerciseConfig: formatExerciseConfigFile (ekPractice, configPath)
6582 of dkApproachesConfig: formatApproachesConfigFile (configPath)
6683 of dkArticlesConfig: formatArticlesConfigFile (configPath)
6784
@@ -116,7 +133,7 @@ proc fmt*(conf: Conf) =
116133 logNormal (" Looking for exercises that lack a formatted '.meta/config.json', " &
117134 " '.approaches/config.json'\n or '.articles/config.json' file..." )
118135
119- let pairs = fmtImpl (trackExerciseSlugs, conf.trackDir )
136+ let pairs = fmtImpl (trackExerciseSlugs, conf)
120137
121138 let userExercise = conf.action.exerciseFmt
122139 if pairs.len > 0 :
0 commit comments