forked from vieter-v/vieter
				
			Started writing cron expression parser [CI SKIP]
							parent
							
								
									e890128bda
								
							
						
					
					
						commit
						6d60ea1538
					
				
							
								
								
									
										4
									
								
								Makefile
								
								
								
								
							
							
						
						
									
										4
									
								
								Makefile
								
								
								
								
							| 
						 | 
					@ -60,6 +60,10 @@ fmt:
 | 
				
			||||||
vet:
 | 
					vet:
 | 
				
			||||||
	$(V) vet -W $(SRC_DIR)
 | 
						$(V) vet -W $(SRC_DIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					.PHONY: test
 | 
				
			||||||
 | 
					test:
 | 
				
			||||||
 | 
						$(V) test $(SRC_DIR)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# Build & patch the V compiler
 | 
					# Build & patch the V compiler
 | 
				
			||||||
.PHONY: v
 | 
					.PHONY: v
 | 
				
			||||||
v: v/v
 | 
					v: v/v
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1,7 +1,32 @@
 | 
				
			||||||
module cron
 | 
					module cron
 | 
				
			||||||
 | 
					
 | 
				
			||||||
import git
 | 
					import git
 | 
				
			||||||
 | 
					import datatypes
 | 
				
			||||||
 | 
					import time
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct ScheduledBuild {
 | 
				
			||||||
 | 
						repo git.GitRepo
 | 
				
			||||||
 | 
						timestamp time.Time
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn (r1 ScheduledBuild) < (r2 ScheduledBuild) bool {
 | 
				
			||||||
 | 
						return r1.timestamp < r2.timestamp
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
pub fn cron(conf Config) ? {
 | 
					pub fn cron(conf Config) ? {
 | 
				
			||||||
	repos_map := git.get_repos(conf.address, conf.api_key) ?
 | 
						// mut queue := datatypes.MinHeap<ScheduledBuild>{}
 | 
				
			||||||
 | 
						// repos_map := git.get_repos(conf.address, conf.api_key) ?
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// for _, repo in repos_map {
 | 
				
			||||||
 | 
						// 	scheduled := ScheduledBuild{
 | 
				
			||||||
 | 
						// 		repo: repo
 | 
				
			||||||
 | 
						// 		timestamp: 25
 | 
				
			||||||
 | 
						// 	}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// 	queue.insert(scheduled)
 | 
				
			||||||
 | 
						// }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						// println(queue)
 | 
				
			||||||
 | 
						exp := "10/2 5 *"
 | 
				
			||||||
 | 
						println(parse_expression(exp) ?)
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,55 @@
 | 
				
			||||||
 | 
					module cron
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import math
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct CronExpression {
 | 
				
			||||||
 | 
						minutes []u32
 | 
				
			||||||
 | 
						hours []u32
 | 
				
			||||||
 | 
						days []u32
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// parse_range parses a given string into a range of integers, if possible.
 | 
				
			||||||
 | 
					fn parse_range(s string, min u32, max u32) ?[]u32 {
 | 
				
			||||||
 | 
						mut out := []u32{}
 | 
				
			||||||
 | 
						mut start := min
 | 
				
			||||||
 | 
						mut interval := u32(1)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if s != '*' {
 | 
				
			||||||
 | 
							exps := s.split('/')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if exps.len > 1 {
 | 
				
			||||||
 | 
								interval = exps[1].u32()
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
							// Here, s solely consists of a number, so that's the only value we
 | 
				
			||||||
 | 
							// should return.
 | 
				
			||||||
 | 
							else{
 | 
				
			||||||
 | 
								return [exps[0].u32()]
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
							if exps[0] != '*' {
 | 
				
			||||||
 | 
								start = math.max(exps[0].u32(), min)
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						for start <= max {
 | 
				
			||||||
 | 
							out << start
 | 
				
			||||||
 | 
							start += interval
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return out
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// min hour day month day-of-week
 | 
				
			||||||
 | 
					fn parse_expression(exp string) ?CronExpression {
 | 
				
			||||||
 | 
						parts := exp.split(' ')
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						if parts.len != 3 {
 | 
				
			||||||
 | 
							return error("Expression must contain 5 space-separated parts.")
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						return CronExpression{
 | 
				
			||||||
 | 
							minutes: parse_range(parts[0], 0, 59) ?
 | 
				
			||||||
 | 
							hours: parse_range(parts[1], 0, 23) ?
 | 
				
			||||||
 | 
							days: parse_range(parts[2], 0, 31) ?
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -0,0 +1,5 @@
 | 
				
			||||||
 | 
					module cron
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					fn test_parse_star_range() {
 | 
				
			||||||
 | 
						assert parse_range('*', 0, 5) == [0, 1, 2, 3, 4, 5]
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -44,6 +44,7 @@ pub fn reader_to_file(mut reader io.BufferedReader, length int, path string) ? {
 | 
				
			||||||
		for to_write > 0 {
 | 
							for to_write > 0 {
 | 
				
			||||||
			// TODO don't just loop infinitely here
 | 
								// TODO don't just loop infinitely here
 | 
				
			||||||
			bytes_written := file.write(buf[bytes_read - to_write..bytes_read]) or { continue }
 | 
								bytes_written := file.write(buf[bytes_read - to_write..bytes_read]) or { continue }
 | 
				
			||||||
 | 
								// file.flush()
 | 
				
			||||||
 | 
					
 | 
				
			||||||
			to_write = to_write - bytes_written
 | 
								to_write = to_write - bytes_written
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in New Issue