module Mail
  grammar RFC2822Obsolete
  
    rule obs_qp
      "\\" [\x00-\x7F]
    end

    rule obs_text
      LF* CR* (obs_char LF* CR*)*
    end

    rule obs_char
      [\x00-\x09]      /       # %d0-127 except CR and
      [\x0B-\x0C]      /       # LF
      [\x0E-\x7F]
    end

    rule obs_utext
      obs_text
    end

    rule obs_phrase
      (word / "." / "@")+
    end

    rule obs_phrase_list
      phrase / (phrase? CFWS? "," CFWS?)+ phrase?
    end

    rule obs_FWS
      WSP+ (CRLF WSP+)*
    end

    rule obs_day_of_week
      CFWS? day_name CFWS?
    end

    rule obs_year
      CFWS? (DIGIT DIGIT) CFWS?
    end

    rule obs_month
      CFWS month_name CFWS
    end

    rule obs_day
      CFWS? (DIGIT / (DIGIT DIGIT))  CFWS?
    end

    rule obs_hour
       CFWS? (DIGIT DIGIT) CFWS?
    end

    rule obs_minute
      CFWS? (DIGIT DIGIT) CFWS?
    end

    rule obs_second
      CFWS? (DIGIT DIGIT) CFWS?
    end

    rule obs_zone
      "UT" / "GMT" /          # Universal Time
                              # North American UT
                              # offsets
      "EST" / "EDT" /         # Eastern:  - 5/ - 4
      "CST" / "CDT" /         # Central:  - 6/ - 5
      "MST" / "MDT" /         # Mountain: - 7/ - 6
      "PST" / "PDT" /         # Pacific:  - 8/ - 7
                              #
      [\x41-\x49] /           # Military zones - "A"
      [\x4B-\x5A] /           # through "I" and "K"
      [\x61-\x69] /           # through "Z", both
      [\x6B-\x7A]             # upper and lower case
    end

    rule obs_angle_addr
      CFWS? "<" obs_route? addr_spec ">" CFWS?
    end
    
    rule obs_route
      CFWS? obs_domain_list ":" CFWS?
    end

    rule obs_domain_list
      "@" domain (("," )* CFWS? "@" domain)*
    end
    
    rule obs_local_part
      word ("." word)*
    end

    rule obs_domain
      atom ("." atom)*
    end

    rule obs_mbox_list
      (mailbox? CFWS? "," CFWS?)+ mailbox?
    end

    rule obs_addr_list
      (address? CFWS? "," CFWS?)+ address?
    end

    rule obs_fields
      (obs_return /
       obs_received /
       obs_orig_date /
       obs_from /
       obs_sender /
       obs_reply_to /
       obs_to /
       obs_cc /
       obs_bcc /
       obs_message_id /
       obs_in_reply_to /
       obs_references /
       obs_subject /
       obs_comments /
       obs_keywords /
       obs_resent_date /
       obs_resent_from /
       obs_resent_send /
       obs_resent_rply /
       obs_resent_to /
       obs_resent_cc /
       obs_resent_bcc /
       obs_resent_mid /
       obs_optional)*
    end

    rule obs_orig_date
      "Date" WSP* ":" date_time CRLF
    end

    rule obs_from
      "From" WSP* ":" mailbox_list CRLF
    end
  
    rule obs_sender
      "Sender" WSP* ":" mailbox CRLF
    end
  
    rule obs_reply_to
      "Reply-To" WSP* ":" mailbox_list CRLF
    end


    rule obs_to
      "To" WSP* ":" address_list CRLF
    end

    rule obs_cc
      "Cc" WSP* ":" address_list CRLF
    end

    rule obs_bcc
      "Bcc" WSP* ":" (address_list / CFWS?) CRLF
    end

    rule obs_message_id
      "Message-ID" WSP* ":" msg_id CRLF
    end

    rule obs_in_reply_to
      "In-Reply-To" WSP* ":" (phrase / msg_id)* CRLF
    end

    rule obs_references
      "References" WSP* ":" (phrase / msg_id)* CRLF
    end

    rule obs_id_left
      local_part
    end

    rule obs_id_right
      domain
    end

    rule obs_subject
      "Subject" WSP* ":" unstructured CRLF
    end

    rule obs_comments
      "Comments" WSP* ":" unstructured CRLF
    end

    rule obs_keywords
      "Keywords" WSP* ":" obs_phrase_list CRLF
    end

    rule obs_resent_from
      "Resent-From" WSP* ":" mailbox_list CRLF
    end

    rule obs_resent_send
      "Resent-Sender" WSP* ":" mailbox CRLF
    end

    rule obs_resent_date
      "Resent-Date" WSP* ":" date_time CRLF
    end

    rule obs_resent_to
      "Resent-To" WSP* ":" address_list CRLF
    end

    rule obs_resent_cc
      "Resent-Cc" WSP* ":" address_list CRLF
    end

    rule obs_resent_bcc
      "Resent-Bcc" WSP* ":" (address_list / CFWS?) CRLF
    end

    rule obs_resent_mid
      "Resent-Message-ID" WSP* ":" msg_id CRLF
    end

    rule obs_resent_rply
      "Resent-Reply-To" WSP* ":" address_list CRLF
    end

    rule obs_return
      "Return-Path" WSP* ":" path CRLF
    end

    rule obs_received
      "Received" WSP* ":" name_val_list CRLF
    end

    rule obs_path
      obs_angle_addr
    end

    rule obs_optional
      field_name WSP* ":" unstructured CRLF
    end
  end
end
