@@ -18,18 +18,19 @@ import EvolutionMetadataModel
1818 An `ExtractionJob` captures all of the required inputs and potential output locations.
1919 */
2020public struct ExtractionJob : Sendable {
21- public enum Source : Sendable , Codable {
21+ public enum Source : Sendable , Codable , Equatable {
2222 case network
2323 case snapshot( URL )
2424 }
2525
26- public enum Output : Sendable , Codable {
26+ public enum Output : Sendable , Codable , Equatable {
2727 case metadataJSON( URL )
2828 case snapshot( URL )
2929 case validationReport
3030 case none
3131 }
3232
33+ let source : Source
3334 let branchInfo : GitHubBranch ?
3435 let proposalListing : [ GitHubContentItem ] ? // Ad-hoc snapshots may not have these
3536 let proposalSpecs : [ ProposalSpec ]
@@ -41,7 +42,8 @@ public struct ExtractionJob: Sendable {
4142 let output : Output
4243 let temporaryProposalsDirectory : URL ?
4344
44- private init ( output: Output , branchInfo: GitHubBranch ? = nil , proposalListing: [ GitHubContentItem ] ? , proposalSpecs: [ ProposalSpec ] , previousResults: [ Proposal ] , expectedResults: [ Proposal ] ? , forcedExtractionIDs: [ String ] , toolVersion: String , extractionDate: Date = Date ( ) ) {
45+ private init ( source: Source , output: Output , branchInfo: GitHubBranch ? = nil , proposalListing: [ GitHubContentItem ] ? , proposalSpecs: [ ProposalSpec ] , previousResults: [ Proposal ] , expectedResults: [ Proposal ] ? , forcedExtractionIDs: [ String ] , toolVersion: String , extractionDate: Date = Date ( ) ) {
46+ self . source = source
4547 self . branchInfo = branchInfo
4648 self . proposalListing = proposalListing
4749 self . proposalSpecs = proposalSpecs
@@ -74,13 +76,17 @@ public struct ExtractionJob: Sendable {
7476 public static func makeExtractionJob( from source: Source , output: Output , ignorePreviousResults: Bool = false , forcedExtractionIDs: [ String ] = [ ] , toolVersion: String = " " , extractionDate: Date = Date ( ) ) async throws -> ExtractionJob {
7577 switch source {
7678 case . network:
77- try await networkExtractionJob ( output: output, ignorePreviousResults: ignorePreviousResults, forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
78- case . snapshot( let snapshotURL ) :
79- try snapshotExtractionJob ( from : snapshotURL , output: output, ignorePreviousResults: ignorePreviousResults, forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
79+ try await networkExtractionJob ( source : source , output: output, ignorePreviousResults: ignorePreviousResults, forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
80+ case . snapshot:
81+ try snapshotExtractionJob ( source : source , output: output, ignorePreviousResults: ignorePreviousResults, forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
8082 }
8183 }
8284
83- private static func snapshotExtractionJob( from snapshotURL: URL , output: Output , ignorePreviousResults: Bool , forcedExtractionIDs: [ String ] , toolVersion: String , extractionDate: Date ) throws -> ExtractionJob {
85+ private static func snapshotExtractionJob( source: Source , output: Output , ignorePreviousResults: Bool , forcedExtractionIDs: [ String ] , toolVersion: String , extractionDate: Date ) throws -> ExtractionJob {
86+
87+ guard case let . snapshot( snapshotURL) = source else {
88+ fatalError ( " snapshotExtractionJob() requires snapshot source " )
89+ }
8490
8591 // Argument validation should ensure correct values. Assert to catch problems in usage in tests.
8692 assert ( snapshotURL. pathExtension == " evosnapshot " , " Snapshot URL must be a directory with 'evosnapshot' extension. " )
@@ -146,18 +152,21 @@ public struct ExtractionJob: Sendable {
146152 // previous-results.json : Previous results. If present, will reuse found proposal entries.
147153 // proposal-listing.json : Results of GitHub query of proposals directory. Contains proposal SHA values.
148154
149- return ExtractionJob ( output: output, branchInfo: branchInfo, proposalListing: proposalListing, proposalSpecs: proposalSpecs, previousResults: previousResults, expectedResults: expectedResults, forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
155+ return ExtractionJob ( source : source , output: output, branchInfo: branchInfo, proposalListing: proposalListing, proposalSpecs: proposalSpecs, previousResults: previousResults, expectedResults: expectedResults, forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
150156 }
151157
152- private static func networkExtractionJob( output: Output , ignorePreviousResults: Bool , forcedExtractionIDs: [ String ] = [ ] , toolVersion: String = " " , extractionDate: Date = Date ( ) ) async throws -> ExtractionJob {
158+ private static func networkExtractionJob( source: Source , output: Output , ignorePreviousResults: Bool , forcedExtractionIDs: [ String ] = [ ] , toolVersion: String = " " , extractionDate: Date = Date ( ) ) async throws -> ExtractionJob {
159+
160+ assert ( source == . network, " networkExtractionJob() requires network source " )
161+
153162 async let previousResults = ignorePreviousResults ? [ ] : PreviousResultsFetcher . fetchPreviousResults ( )
154163
155164 let mainBranchInfo = try await GitHubFetcher . fetchMainBranch ( )
156165 async let proposalContentItems = GitHubFetcher . fetchProposalContentItems ( for: mainBranchInfo. commit. sha)
157166
158167 let proposalSpecs = try await proposalContentItems. enumerated ( ) . map { $1. proposalSpec ( sortIndex: $0) }
159168
160- return await ExtractionJob ( output: output, branchInfo: mainBranchInfo, proposalListing: try proposalContentItems, proposalSpecs: proposalSpecs, previousResults: try await previousResults, expectedResults: nil , forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
169+ return await ExtractionJob ( source : source , output: output, branchInfo: mainBranchInfo, proposalListing: try proposalContentItems, proposalSpecs: proposalSpecs, previousResults: try await previousResults, expectedResults: nil , forcedExtractionIDs: forcedExtractionIDs, toolVersion: toolVersion, extractionDate: extractionDate)
161170 }
162171
163172
0 commit comments