forge/rep: code: compile recursively
This commit is contained in:
		
							parent
							
								
									cea36b0320
								
							
						
					
					
						commit
						fa2aa23e87
					
				
					 2 changed files with 24 additions and 10 deletions
				
			
		| 
						 | 
				
			
			@ -19,17 +19,9 @@ func ParseJson(inp string) coderep {
 | 
			
		|||
func prepare(raw interface{}) coderep {
 | 
			
		||||
	switch ri := raw.(type) {
 | 
			
		||||
	case []interface{}:
 | 
			
		||||
		c := code{}
 | 
			
		||||
		for _, it := range ri {
 | 
			
		||||
			c = append(c, it)
 | 
			
		||||
		}
 | 
			
		||||
		return c
 | 
			
		||||
		return makeCode(ri)
 | 
			
		||||
	case map[string]interface{}:
 | 
			
		||||
		m := module{}
 | 
			
		||||
		for k, v := range ri {
 | 
			
		||||
			m[k] = v
 | 
			
		||||
		}
 | 
			
		||||
		return m
 | 
			
		||||
		return makeModule(ri)
 | 
			
		||||
	}
 | 
			
		||||
	return nil
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -42,6 +42,12 @@ func (ci code) Compile(f forge.FE) forge.FPtr {
 | 
			
		|||
			}
 | 
			
		||||
		case code:
 | 
			
		||||
			c.Append(i.Compile(f))
 | 
			
		||||
		case []interface{}:
 | 
			
		||||
			c.Append(makeCode(i).Compile(f))
 | 
			
		||||
		case module:
 | 
			
		||||
			c.Append(i.Compile(f))
 | 
			
		||||
		case map[string]interface{}:
 | 
			
		||||
			c.Append(makeModule(i).Compile(f))
 | 
			
		||||
		}
 | 
			
		||||
	}
 | 
			
		||||
	return c.Reset()
 | 
			
		||||
| 
						 | 
				
			
			@ -57,6 +63,14 @@ func compStr(f forge.FE, s string) (forge.FItem, error) {
 | 
			
		|||
	return nil, fmt.Errorf("not found: %s", s)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeCode(ri []interface{}) code {
 | 
			
		||||
	c := code{}
 | 
			
		||||
	for _, it := range ri {
 | 
			
		||||
		c = append(c, it)
 | 
			
		||||
	}
 | 
			
		||||
	return c
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// module - code definitions, represented by a map
 | 
			
		||||
 | 
			
		||||
type module map[string]citem
 | 
			
		||||
| 
						 | 
				
			
			@ -65,3 +79,11 @@ func (m module) Compile(f forge.FE) forge.FPtr {
 | 
			
		|||
	v := voc.NewVoc(f.Voc())
 | 
			
		||||
	return f.Code(v)
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
func makeModule(ri map[string]interface{}) module {
 | 
			
		||||
	m := module{}
 | 
			
		||||
	for k, v := range ri {
 | 
			
		||||
		m[k] = v
 | 
			
		||||
	}
 | 
			
		||||
	return m
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		
		Reference in a new issue